BeautifulSoup 学习笔记

Beautiful Soup 的基础使用

Copy
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

节点选择器

直接调用节点的名称，再调用 string，就可以节点内的文本

Copy
soup.a.string --->获取第一个 a 标签的文本，返回文本字符串
soup.a --->获取第一个 a 标签的 html 代码（Tag 类型），可嵌套选择
soup.a.attrs['class']
soup.a['class'] --->获取属性；属性唯一，返回字符串；属性不唯一，返回列表；

关联选择

子节点

Copy
soup.a.contents --->返回列表
soup.a.children --->返回生成器

子孙节点

Copy
soup.a.descendands --->返回生成器

父节点

Copy
soup.a.parent --->返回第一个a节点的父节点

祖先节点

Copy
soup.a.parents --->返回生成器

兄弟节点

Copy
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 类型

Copy
soup.find_all(attrs={'id':'list-1'})
soup.find_all(id='list-1')
soup.find_all(class_='element') --->class为python关键字，后边需加'_'

text：该参数可用来匹配节点的文本，传入形式可以是字符串，也可以是正则表达式对象

Copy
soup.find_all(text=re.compile('link')) -->返回所有匹配正则表达式的节点文本组成的列表

find(name, attrs, recusive, text, **kwargs)：查询第一个符合条件的元素，用法与find_all() 相同，返回的是单个 Tag 类型

CSS 选择器

调用 select() 方法，传入相应的 CSS 选择器即可：soup.select('CSS 选择器语句') 返回列表，元素为 Tag 类型

Copy
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() --->获取节点内的所有文本