文档
使用-bs4如何选择文档中的元素
- 安装
bs4是一个可以从HTML或XML文件中提取数据的Python库.除了安装bs4模块,还需要安装文档解析器,以lxml HTML 解析器为例,通常使用该解析器
pip install lxml
- 使用,以一段html文档为例,使用bs4来对其进行解析
from bs4 import BeautifulSoup
html = '''
<title name='bbb'>
<h2>2222222222222222222</h2>
<p>123123123</p>
<h1>99999999999999</h1>
豆瓣读书
</title>
<title name='ccc' class='2'>
豆瓣电影
</title>
'''
soup = BeautifulSoup(html, 'lxml')
-
节点选择器:只选择第一个匹配到的标签元素
# 节点选择器:只选择第一个匹配到的标签元素
# 标签选择
print(soup.title)
print('===================================')
# 标签名称
print(soup.title.name)
print('===================================')
# 标签内容
print(soup.title.text)
print('===================================')
# 标签指定内容选择:豆瓣读书
print(list(soup.title))
print(list(soup.title)[6].strip()) # 去除头尾空格
print('===================================')
# 标签属性选择:获取标签属性两种方法
print(soup.title.attrs['name'], soup.title['name'])
print('===================================')
# 嵌套选择标签
print(soup.title.h2)
print(soup.title.h2.text)
结果:
<title name="bbb">
<h2>2222222222222222222</h2>
<p>123123123</p>
<h1>99999999999999</h1>
豆瓣读书
</title>
===================================
title
===================================
2222222222222222222
123123123
99999999999999
豆瓣读书
===================================
['\n', <h2>2222222222222222222</h2>, '\n', <p>123123123</p>, '\n', <h1>99999999999999</h1>, '\n 豆瓣读书\n']
豆瓣读书
===================================
bbb bbb
===================================
<h2>2222222222222222222</h2>
2222222222222222222
- 方法选择器
# 方法选择器
# 根据节点名name来选择节点
print(soup.find(name='title'))
print(soup.find_all(name='title'))
print('===================================')
# 选择指定节点
print(soup.find_all(name='title')[1])
print('===================================')
# 根据属性attrs来选择节点
print(soup.find(attrs={'name':'ccc'}))
print('===================================')
# 根据文本text来匹配节点文本
print(soup.find(text='123123123')) # 注意需要一个完整的字符串,换行符也包含在其中
print(soup.find(text=re.compile('电影')))
print('===================================')
<title name="bbb">
<h2>2222222222222222222</h2>
<p>123123123</p>
<h1>99999999999999</h1>
豆瓣读书
</title>
[<title name="bbb">
<h2>2222222222222222222</h2>
<p>123123123</p>
<h1>99999999999999</h1>
豆瓣读书
</title>, <title class="2" name="ccc">
豆瓣电影
</title>]
===================================
<title class="2" name="ccc">
豆瓣电影
</title>
===================================
<title class="2" name="ccc">
豆瓣电影
</title>
===================================
123123123
豆瓣电影
===================================
- CSS选择器
# Css选择器
# 根据标签名选择节点
print(soup.select('title'))
print('===================================')
# 根据属性选择节点:带有class属性的title节点
print(soup.select('title[class]'))
print('===================================')
# 根据属性值选择节点
print(soup.select('title[name="ccc"]'))
print('===================================')
# 获取节点的文本内容
print(soup.select('title')[0].text)
print(soup.select('title')[0].get_text())
print('===================================')
# 获取节点属性值
print(soup.select('title')[0]['name'])
print('===================================')
# css选择器 或者
print(soup.select('title h2,h1'))
结果:
[<title name="bbb">
<h2>2222222222222222222</h2>
<p>123123123</p>
<h1>99999999999999</h1>
豆瓣读书
</title>, <title class="2" name="ccc">
豆瓣电影
</title>]
===================================
[<title class="2" name="ccc">
豆瓣电影
</title>]
===================================
[<title class="2" name="ccc">
豆瓣电影
</title>]
===================================
2222222222222222222
123123123
99999999999999
豆瓣读书
2222222222222222222
123123123
99999999999999
豆瓣读书
===================================
bbb
===================================
[<h2>2222222222222222222</h2>, <h1>99999999999999</h1>]