BeautifulSoup
BeautifulSoup 是一个Python库,用于从 HTML 提取数据
它提供了简单而灵活的方式来遍历和搜索文档树,以及解析和提取所需的数据
安装
BeautifulSoup的安装涉及第三方的扩展
pip3 install beautifulsoup4
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml
pip install lxml
基本使用
from bs4 import BeautifulSoup
import requests
url = 'https://www.cnblogs.com'
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'}
res = requests.get(url=url,headers=header)
soup = BeautifulSoup(res.text,'lxml')
show = soup.prettify() #处理好缩进,结构化显示
print(show)
遍历文档树
遍历文档树:即直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个
soup
为上文获取的网页解析对象
-
soup.标签名
:获取标签对象
-
soup.标签名.name
:获取标签的名称
-
soup.标签名.attrs
获取标签的属性
-
获取标签的内容
-
soup.标签名.string
:某标签下的文本只有一个时,取到,否则为None
-
soup.标签名.strings
:拿到一个生成器对象, 取到某标签下所有的文本内容
-
soup.标签名.text
:取到某标签下所有的文本内容
-
soup.标签名.stripped_strings
:去掉空白
-
-
嵌套选择
-
子节点、子孙节点
-
soup.标签名.contents
:某标签下所有子节点
-
soup.标签名.children
:得到一个迭代器,包含某标签下所有子节点
-
-
父节点、祖先节点
-
soup.标签名.parent
:获取父节点
-
soup.标签名.parents
:获取父节点的父节点,生成器
-
搜索文档树
find 和 find_all
两者的唯一区别是:find_all() 方法的返回结果是值包含一个元素的列表,而 find() 方法直接返回结果
-
name:搜索name参数的值可以使任一类型的 过滤器
-
keyword:key=value的形式,value可以是过滤器:字符串 , 正则表达式,列表, True
注意class是关键字,所以要加
_
-
按照类名查找
查找class = post-meta-item 的span标签
-
limit:find_all限制条数
查找class = post-meta-item 的span标签,输出两条结果
五种过滤器
-
字符串:即标签名
-
正则表达式
-
列表
如果传入列表参数,Beautiful Soup会将与列表中任一元素匹配的内容返回.下面代码找到文档中所有<a>
标签和<p>
标签:
-
True
可以匹配任何值,下面代码查找到所有的tag,但是不会返回字符串节点
CSS选择器
暂不赘述
Xpath
from lxml import etree
XPath 是一门在 XML 文档中查找信息的语言
import requests
from lxml import etree
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'}
url = 'https://www.cnblogs.com'
res = requests.get(url=url,headers=header)
html = etree.HTML(res.text)
节点
-
所有节点
-
指定节点(结果为列表)
-
子节点,子孙节点
-
父节点
属性匹配
-
文本获取
-
属性获取
表达式 | 含义 |
---|---|
nodename | 选取此层级节点下的所有子节点 |
/ | 代表从根节点进行选取 |
// | 可以理解为匹配,就是在所有节点中选取此节点,直到匹配为止 |
. | 选取当前节点 |
… | 选取当前节点上一层(上一级目录) |
@ | 选取属性(也是匹配) |