Beautiful Soup 的基础使用#
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
节点选择器#
直接调用节点的名称,再调用 string,就可以节点内的文本
soup.a.string --->获取第一个 a 标签的文本,返回文本字符串
soup.a --->获取第一个 a 标签的 html 代码(Tag 类型),可嵌套选择
soup.a.attrs['class']
soup.a['class'] --->获取属性;属性唯一,返回字符串;属性不唯一,返回列表;
关联选择#
- 子节点
soup.a.contents --->返回列表
soup.a.children --->返回生成器
- 子孙节点
soup.a.descendands --->返回生成器
- 父节点
soup.a.parent --->返回第一个a节点的父节点
- 祖先节点
soup.a.parents --->返回生成器
- 兄弟节点
soup.a.next_sibling --->返回下一个兄弟节点
soup.a.previous_sibling --->返回上一个兄弟节点
soup.a.next_siblings --->返回后面的兄弟节点,生成器类型
soup.a.previous_siblings --->返回前面的兄弟节点,生成器类型
以上方法返回结果是单个节点,可直接调用 string、attrs 等属性获得其文本和属性内容;
如果返回的是多个节点的生成器,则可转化为列表后,取出某个元素然后再调用 string、attrs 等属性;
方法选择器#
find_all(name, attrs, recusive, text, **kwargs)
: 查询所有符合条件的元素
name
:根据节点名查询,返回列表,Tag 类型-
attrs
:根据属性来查询,返回列表,Tag 类型
soup.find_all(attrs={'id':'list-1'})
soup.find_all(id='list-1')
soup.find_all(class_='element') --->class为python关键字,后边需加'_'
text
:该参数可用来匹配节点的文本,传入形式可以是字符串,也可以是正则表达式对象
soup.find_all(text=re.compile('link')) -->返回所有匹配正则表达式的节点文本组成的列表
find(name, attrs, recusive, text, **kwargs)
:查询第一个符合条件的元素,用法与find_all()
相同,返回的是单个 Tag 类型
CSS 选择器#
调用 select()
方法,传入相应的 CSS 选择器即可:soup.select('CSS 选择器语句')
返回列表,元素为 Tag 类型
1.支持嵌套选择
for ul in soup.select('ul'):
print(ul.select('li'))
2.获取属性
for ul in soup.select('ul'):
content = ul['id']
content = ul.attrs['id']
3.获取文本
for ul in soup.select('ul'):
content = ul.string --->获取直系文本
content = ul.get_text() --->获取节点内的所有文本