爬虫 - 网页解析库
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 | 选取此层级节点下的所有子节点 |
| / | 代表从根节点进行选取 |
| // | 可以理解为匹配,就是在所有节点中选取此节点,直到匹配为止 |
| . | 选取当前节点 |
| … | 选取当前节点上一层(上一级目录) |
| @ | 选取属性(也是匹配) |





























浙公网安备 33010602011771号