bs4遍历文档树
数据准备:
# 导入模块
from bs4 import BeautifulSoup
# 查询数据文本
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" id='id_xx' xx='zz'>lqz <b>The Dormouse's story <span>彭于晏</span></b> xx</p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# 解析库选择
# soup=BeautifulSoup(html_doc,'html.parser')
soup = BeautifulSoup(html_doc, 'lxml') # pip3 install lxml
1 文档容错能力
res=soup.prettify()
# 能够自动补全并美化标签
print(res)
2 遍历文档树
文档树:html开头 ---title结尾,中间包含了很多标签
# 通过 . 查找标签
print(soup.html.head.title)
3 通过 . 找到p标签
只能找到最先找到的第一个
print(soup.html.body.p)
# 或者
print(soup.p)
4 获取标签的名称
p = soup.html.body.p
print(p.name)
5 获取标签的属性
p = soup.html.body.p
print(p.attrs.get('class')) # class 特殊,可能有多个,所以放在列表汇总
print(soup.a.attrs.get('href'))
# 或者
print(soup.a['href'])
6 获取标签的文本内容
6.1 标签对象.text # 拿标签子子孙孙
6.2 标签对象.string # 该标签有且只有自己有文本内容才能拿出来
6.3 标签对象.strings # 拿子子孙孙,都放在生成器中
print(soup.html.body.p.b.text)
print(soup.html.body.p.text)
print(soup.html.body.p.string) # 不能有子 孙
print(soup.html.body.p.b.string) # 有且只有它自己
print(soup.html.body.p.strings) # generator 生成器---》把子子孙孙的文本内容都放在生成器中,跟text很像
print(list(soup.html.body.p.strings)) # generator 生成器---》把子子孙孙的文本内容都放在生成器中,跟text很像
7 嵌套选择 . 完后可以继续再 .
print(soup.head.title.text)
8 子节点、子孙节点
print(soup.p.contents) # p下所有子节点,只拿直接子节点
print(soup.p.children) # 直接子节点 得到一个迭代器,包含p下所有子节点
for i,child in enumerate(soup.p.children):
print(i,child)
print(soup.p.descendants) #获取子孙节点,p下所有的标签都会选择出来 generator
for i,child in enumerate(soup.p.descendants):
print(i,child)
9 父节点、祖先节点
print(soup.a.parent) # 获取a标签的父节点
print(list(soup.a.parents)) # 找到a标签所有的祖先节点,父亲的父亲,父亲的父亲的父亲...
10 兄弟节点
print(soup.a.next_sibling) #下一个兄弟
print(soup.a.previous_sibling) #上一个兄弟
print(list(soup.a.next_siblings)) #下面的兄弟们=>生成器对象
print(soup.a.previous_siblings) #上面的兄弟们=>生成器对象