对象的种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag
, NavigableString
, BeautifulSoup
, Comment
。
Tag
Tag对象与XML或者HTML原生文档中的tag相同:
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>') tag = soup.b type(tag) # <class 'bs4.element.Tag'>
Tag有很多方法和属性,其中最重要的两个属性是name、attributes。
Name:
每个tag都有自己的名字,通过 .name
来获取:
tag.name # u'b'
Attributes:
一个tag可能有很多个属性,tag<b class="boldest">有一个“class”的属性,值为"boldest",tag的属性的操作方法与字典相同:
tag['class'] # u'boldest'
也可以直接”点”取属性, 比如: .attrs
(.attrs返回一个字典,包含该tag的所有属性和值):
tag.attrs # {u'class': u'boldest'}
tag.attrs["class"]
# u'boldest'
tag的属性可以被添加,删除或修改. 再说一次, tag的属性操作方法与字典一样。
多值属性
在Beautiful Soup中多值属性的返回类型是list:
css_soup = BeautifulSoup('<p class="body strikeout"></p>') css_soup.p['class'] # ["body", "strikeout"] css_soup = BeautifulSoup('<p class="body"></p>') css_soup.p['class'] # ["body"]
可遍历的字符串
字符串常被包含在tag内.Beautiful Soup用 NavigableString
类来包装tag中的字符串:
tag.string # u'Extremely bold' type(tag.string) # <class 'bs4.element.NavigableString'>
tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用replace_with()方法:
tag.string.replace_with("No longer bold") tag # <blockquote>No longer bold</blockquote>
BeasutifulSoup
BeautifulSoup
对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag
对象。
因为 BeautifulSoup
对象并不是真正的HTML或XML的tag,所以它没有name和attribute属性.但有时查看它的 .name
属性是很方便的,所以 BeautifulSoup
对象包含了一个值为 “[document]” 的特殊属性 .name:
soup.name # u'[document]'
遍历文档树
子节点
Tag的名字
操作文档树最简单的方法就是告诉它你想获取的tag的name.如果想获取 <head> 标签,只要用 soup.head:
soup.head # <head><title>The Dormouse's story</title></head> soup.title # <title>The Dormouse's story</title>
.contents和.children
tag的 .contents
属性可以将tag的子节点以列表的方式输出:
head_tag = soup.head head_tag # <head><title>The Dormouse's story</title></head> head_tag.contents [<title>The Dormouse's story</title>] title_tag = head_tag.contents[0] title_tag # <title>The Dormouse's story</title> title_tag.contentshead_tag = soup.head head_tag # <head><title>The Dormouse's story</title></head> head_tag.contents [<title>The Dormouse's story</title>] title_tag = head_tag.contents[0] title_tag # <title>The Dormouse's story</title> title_tag.contents # [u'The Dormouse's story'] # [u'The Dormouse's story']
BeautifulSoup
对象本身一定会包含子节点,也就是说<html>标签也是 BeautifulSoup
对象的子节点:
len(soup.contents) # 1 soup.contents[0].name # u'html'
字符串没有 .contents
属性,因为字符串没有子节点。
通过tag的 .children
生成器,可以对tag的子节点进行循环:
for child in title_tag.children: print(child) # The Dormouse's story