对象的种类
解析一个文档,只需要将其传给BeautifulSoup
构造方法,可以传一个字符串或者文件句柄。
示例
from bs4 import BeautifulSoup
with open("index.html") as fp:
soup = BeautifulSoup(fp)
soup = BeautifulSoup("<html>data</html>")
Tag标签
Tag中最重要的特征:name
(标签名),attributes
(属性)
示例:
>>> soup = BeautifulSoup('<b class="boldest">Extremely bold</b>')
>>> tag = soup.b
>>> type(tag)
<class 'bs4.element.Tag'>
Name
每一个标签都有一个名字,可以通过.name
方法来获取:
>>> tag.name
'b'
如果改变了标签的名称,将会影响所有通过当前BeautifulSoup
对象生成的HTML文档。
Attributes
一个标签可以有多个属性。比如标签<b id='boldest>
有一个id
的属性,它的值为boldest
,标签访问属性的方法与字典相同:
tag['id']
['boldest']
也可以通过使用.attrs
直接访问,返回的字典:
>>> tag.attrs
{'id': ['boldest']}
标签的属性可以被添加、删除或者修改,标签的属性操作方法和字典是一样的
Multi-valued attributes(多重属性)
在BS中,是以列表的形式来处理多值属性的:
>>> css_soup = BeautifulSoup('<p class="body"></p>')
>>> css_soup.p['class']
['body']
>>> css_soup = BeautifulSoup('<p class="body strikeout"></p>')
>>> css_soup.p['class']
['body', 'strikeout']
但是如果某个属性看起来存在多个值,但是在html中的定义不是一个多值属性,那么BS会将其作为字符串返回。如:
>>> id_soup = BeautifulSoup('<p id="FishC id"></p>')
>>> id_soup.p['id']
'FishC id'
将标签转换为字符串时,多值属性会合并成一个值;
>>> rel_soup = BeautifulSoup('<p>Back to the <a rel="index">homepage</a></p>')
>>> rel_soup.a['rel']
['index']
>>> rel_soup.a['rel'] = ['index', 'contents']
>>> print(rel_soup.p)
<p>Back to the <a rel="index contents">homepage</a></p>
如果解析的文档是XML格式,那么tag中不包含多值属性
NavigableString
字符串对应的是标签内部包含的文本。BeautifulSoup
使用NavigableString
类包装这些文本:
>>> tag.string
'Extremely bold'
>>> type(tag.string)
<class 'bs4.element.NavigableString'>
一个NavigableString
对象与Python中的Unicode字符串类似,并且还支持在遍历文档树和搜索文档树中的一些特性,通过str()
方法可以将NavigableString
对象转化为Unicode字符串:
>>> unicode_string = str(tag.string)
>>> unicode_string
'Extremely bold'
>>> type(unicode_string)
<class 'str'>
如果标签中包含的字符串不能被编辑,但是可以被替换成其他的字符,可以使用replace_with()
方法。
NavigableString
对象支持遍历文档树和搜索文档树中定义的大部分属性,但不是全部。
BeautifulSoup
BeautifulSoup
对象表示的是一个文档的全部内容,大部分时候可以将其当做tag
对象,支持遍历文档树和搜索文档树中的描述的大部分的方法。
因为 BeautifulSoup
对象并不是真正的 HTML 或 XML 标签,所以它没有 name 和 attributes。但有时查看它的 .name 属性是很方便的,所以 BeautifulSoup
对象包含了一个值为"[document]"
的特殊属性.name
:
>>> soup.name
'[document]'
Comments and Special Strings
Tag,NavigableString
和 BeautifulSoup
几乎涵盖了 HTML 或 XML 文档中的所有内容,但不包括注释。
>>> markup = "<b><!--Hey, buddy. Want to buy a used parser?--></b>"
>>> soup = BeautifulSoup(markup)
>>> comment = soup.b.string
>>> type(comment)
<class 'bs4.element.Comment'>
Comment
对象是一个特殊类型的VNavigableString
对象:
>>> comment
'Hey, buddy. Want to buy a used parser?'
但是出现在HTML文档中的时候,Comment
对象会使用特殊的格式输出:
>>> comment
'Hey, buddy. Want to buy a used parser?'
BeautifulSoup
中定义的其它类都可能会出现在 XML 的文档中:CData,ProcessingInstruction
,Declaration
和 Doctype
。与 Comment 对象类似,这些类都是 NavigableString
的子类,只是添加了一些额外方法的字符串。下面是用 CDATA 来替代注释的例子:
>>> from bs4 import CData
>>> cdata = CData("A CDATA block")
>>> comment.replace_with(cdata)
'Hey, buddy. Want to buy a used parser?'
>>> print(soup.b.prettify())
<b>
<![CDATA[A CDATA block]]>
</b>
网友评论