【3】数据筛选3 - BeautifulSoup4

2018-11-24  本文已影响0人  夏夏夏夏颜曦

目录


    1. 开发前准备
    2. 不同解析器对比
    3. BeautifulSoup4 初始化和节点对象的认识
    4. BS4 案例操作:初始化对象文档
    5. 节点查询:子节点
    6. 节点查询:父节点
    7. 节点查询:兄弟节点
    8. 节点查询:解析顺序
    9. 高级查询: find/find_all 检索
    10. 高级查询: CSS 选择器


1.开发前准备

2.不同解析器对比

解析器 使用 优缺点
标准库 BeautifulSoup(html, ‘html.parser’) 优点:内置标准库、执行速度适中、容错能力强.
缺点:对中文解析的容错能力有限
lxml BeautifulSoup(html, ‘lxml’) 优点:速度快,容错能力强
缺点:需要安装 c 语言库
lxml BeautifulSoup(html, [‘lxml’, ‘xml’]) 唯一支持 XML 的解析器
html5lib BeautifulSoup(html, ‘html5lib’) 优点:容错能力最好, 浏览器方式解析文档, 生成 H5 格式的文档
缺点:速度慢,不依赖外部扩展

3.BeautifulSoup4 初始化和节点对象的认识

4.BS4 案例操作:初始化对象文档

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></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>
</body>
</html>
"""
from bs4 import BeautifulSoup
# 构建 bs4 文档对象
soup = BeautifulSoup(html_doc, 'lxml')
print(type(soup)) # <class 'bs4.BeautifulSoup'>

5.节点查询: 子节点

# 节点名称查询
print(soup.title) # <title>The Dormouse's story</title>
print(soup.p) # <p class="title"><b>The Dormouse's story</b></p>
print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 子节点查询
chs = soup.contents
print(type(chs), len(chs)) # <class 'list'> 2
chs2 = soup.children
print(type(chs2), len(list(chs2))) # <class 'list_iterator'> 2
# 包含节点查询
chs3 = soup.descendants
print(type(chs3), len(list(chs3))) # <class 'generator'> 28
# 子节点内容获取
# 获取节点内部文本数据
print(soup.title.string) # The Dormouse's story
# 获取文本节点的文本数据
print(soup.title.contents[0].string) # The Dormouse's story
# 如果包含子节点并且不是文本节点,返回 None
print(soup.body.string) # None
# 获取包含的所有文本数据,包括空白字符
print(soup.body.strings) # <generator object Tag._all_strings at 0x0000021B6360F6D8>
# 获取包含的所有文本数据,剔除空白字符
print(soup.body.stripped_strings) # <generator object Tag.stripped_strings at 0x0000022BBB38F6D8>

6.节点查询:父节点

# ##########################父节点查询

print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 查询直接父节点
print(soup.a.parent.name) # p
# 遍历查询所有父节点
print([tag.name for tag in soup.a.parents]) # ['p', 'body', 'html', '[document]']

7.节点查询: 兄弟节点

# ##########################兄弟节点

# 获取当前节点
print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 获取前一个兄弟节点:得到文本节点
print(soup.a.previous_sibling) # Once upon a time there were three little sisters; and their
names were
# 获取后一个兄弟节点:得到文本节点
print(soup.a.next_sibling) #,
# 获取所有的前面的兄弟节点:得到所有紧跟当前节点前面的兄弟节点的生成器对象
print(soup.a.previous_siblings) # <generator object PageElement.previous_siblings at
0x000001EF06B57750>
# 获取所有的后面的兄弟节点:得到所有紧跟当前节点后面的兄弟节点的生成器对象
print(soup.a.next_siblings) # <generator object PageElement.next_siblings at 0x0000018A1B41F6D8>

8.节点查询:解析顺序

BeautifulSoup4 提供了一种比较特殊的操作:按照文档的解析顺序进行节点的查询,解析顺序和浏览器解释 HTML 文档的顺序是一致的

# #########################解析顺序节点

#获取当前节点
print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 获取前一个兄弟节点:得到文本节点
print(soup.a.previous_element) # Once upon a time there were three little sisters; and their
names were
# 获取后一个兄弟节点:得到文本节点
print(soup.a.next_element) #Elsie
# 获取所有的前面的兄弟节点:得到所有紧跟当前节点前面的兄弟节点的生成器对象
print(soup.a.previous_elements) # <generator object PageElement.previous_elements at
0x0000013EC8C9F6D8>
# 获取所有的后面的兄弟节点:得到所有紧跟当前节点后面的兄弟节点的生成器对象
print(soup.a.next_elements) # <generator object PageElement.next_elements at 0x0000013EC8C9F6D8>
# 获取解析过程节点顺序
print([tag.name if tag.name else tag for tag in soup.html.next_elements])

➔ 解析结果:

 ['head', 'title', "The Dormouse's story", '\n', 'body', '\n', 'p', 'b', "The Dormouse's story", '\n',
'p', 'Once upon a time there were three little sisters; and their names were\n', 'a', 'Elsie', ',\n', 'a',
'Lacie', ' and\n', 'a', 'Tillie', ';\nand they lived at the bottom of a well.', '\n', 'p', '...', '\n', '\n',
'\n']

9.高级查询: find/find_all 检索

10. 高级查询: CSS 选择器

# ##########################css 查询

print(soup.select("title")) # 标签选择器
print(soup.select("#link1")) # id 选择器
print(soup.select(".sister")) # class 选择器
print(soup.select("p > a")) # 子类选择器
print(soup.select("p a")) # 包含选择器
print(soup.select("p, a, b")) # 群组选择器
print(soup.select("#link1 ~ .sister")) # 兄弟选择器
print(soup.select("#link1 + .sister")) # 兄弟选择器
print(soup.select("p[class='title']")) # 属性选择器
print(soup.select("a:nth-of-type(2)")) # 伪类选择器
上一篇下一篇

猜你喜欢

热点阅读