BeautifulSoup
简介:
BeautiflSoup是一个可以从html或者xml中提取数据的python库,Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,
每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment 。
Tag:
属性1:Name 通过.name获取Tag的名字(可以修改该Tag的Name,但是会影响所有通过当前Beautiful Soup对象生成的HTML文档)。
属性2:Attributes 通过.attrs获取该Tag的所有属性(字典形式,可以增加、删除、修改属性)。
NavigableString :
字符串常被包含在tag内,通过.string可以获取NavigableString对象。
通过unicode方法可以将NavigableString对象转换为unicode对象(unicode(tag.string))。
tag中包含的字符串不能编辑,但是可以被替换成其它的字符串,用 replace_with() 方法:tag.string.replace_with("No")。
BeautifulSoup:
BeautifulSoup 对象表示的是一个文档的全部内容。
Comment:
<!-- Hey, buddy. Want to buy a used parser?-->。
遍历文档树:
获取节点:
soup.p:只能返回第一个p标签。
soup.find_all('a'):以列表形式返回所有a标签。
获取字符串:
.string:
1:如果tag(不论有多少子孙节点)只有一个 NavigableString 类型子节点,那么这个tag可以使用 .string 得到字符串。
2:如果一个tag仅有一个子节点,那么这个tag也可以使用 .string 方法,输出结果与当前唯 一 子节点的 .string 结果相同。
3:如果tag包含了多个子节点,tag就无法确定 .string 方法应该调用哪个子节点的内容, .string 的输出结果是 None 。
.strings:
如果tag中包含多个字符串,可以使用 .strings 来循环获取:for string in tag.strings。
注:通过.get_text()方法可以直接获得unicode字符串。
下行遍历(.contents、.children、.descendants)
获取子节点:
tag的 .contents 属性可以将tag的子节点以列表的方式输出:body.contents(注:字符串没有 .contents 属性,因为字符串没有子节点)。
通过tag的 .children 生成器,可以对tag的子节点进行循环:for child in body.children。
获取子孙节点:
通过tag的.descendants 属性可以对所有的子孙节点进行递归循环 :for child in body.descendants。
上行遍历(.parent、.parents)
获取父节点:
通过 .parent 属性来获取某个元素的父节点:tag.parent。
通过元素的 .parents 属性可以递归得到元素的所有父辈节点:for parent in tag.parents。
平行遍历(.next_sibling、.previou_sibling、.next_siblings、.previous_siblings)
.next_sibling:返回下一个平行节点标签:tag.next_sibling。
.previous_sibling:返回上一个平行节点标签:tag.previous_sibling。
搜索文档树:
find_all(name,attrs,recursive,text,**kwargs)
name:参数值可以是字符串(标签名)、列表(包含多个标签)、正则表达式(tag.find_all(re.compile('b')),所有以b开头的标签)、True(该标签下的所有标签)。
attrs:如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索。
1:tag.find_all(id="link2")
2:tag.find_all(href=re.compile("elsie"))
3:tag.find_all(id=True)
4:tag.find_all(href=re.compile("elsie"), id='link1')
5:tag.find_all(attrs={"data-foo": "value"})
recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False。
text:通过 text 参数可以搜索文档中的字符串内容.与 name 参数的可选值一样。
limit:限制find_all()返回结果的数量。