Beautiful Soup 的作用
Beautiful Soup 4 通常简称为 BS4,可将标记文档转换成 Python 对象树。可以遍历父元素和子元素,按标签或属性搜索,并提取文本、链接等值。
它是一个数据解析库,不负责下载网页,也不是爬虫。必须先用其他工具获取网页,Beautiful Soup 才能处理。它也可以修改标记,但在网页采集中,更常用于数据提取和清洗。
Beautiful Soup 如何解析 HTML
创建 BeautifulSoup 对象时需要选择解析器。Python 内置的 html.parser 不需要额外安装依赖,而 lxml 等解析器在性能和 XML 支持方面各有不同。如果源文档包含格式错误的标记,解析结果可能会有差异。
解析后,可以使用 find()、find_all() 和 select() 等方法定位元素。select() 接受 CSS 选择器,例如 .product .price 或 article > h2。
将 Beautiful Soup 与代理配合使用
Beautiful Soup 本身没有网络或代理设置。需要在下载网页的 HTTP 客户端中配置代理服务器,再将返回的 HTML 交给 Beautiful Soup 处理。
import requests
from bs4 import BeautifulSoup
proxy = "http://USERNAME:PASSWORD@HOST:PORT"
response = requests.get(
"https://example.com",
proxies={"http": proxy, "https": proxy},
timeout=20,
)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
print(soup.select_one("h1").get_text(strip=True))
应在 HTTP 客户端中设置超时并处理重试。代理可以改变网站看到的来源 IP,但仍需合理控制请求频率。请遵守网站条款、robots.txt 规则和限速要求。
Beautiful Soup 与其他采集工具的区别
| 工具 | 主要功能 | 最适合的场景 |
|---|---|---|
| Beautiful Soup | 解析已有的 HTML 或 XML | 小型数据提取脚本 |
| Scrapy | 采集、调度和解析 | 多页面采集 |
| Playwright | 控制浏览器 | 交互式或动态页面 |
Beautiful Soup 不会运行脚本,也不能完成 JavaScript 渲染。如果数据只在脚本执行后出现,应使用浏览器工具渲染页面,再将渲染后的 HTML 交给 Beautiful Soup。如果需要跨多个页面使用内置请求队列、并发和重试处理,请选择 Scrapy。
常见问题
Beautiful Soup 是网页采集工具吗?
单独使用时不是。Beautiful Soup 负责解析和搜索标记,HTTP 客户端或爬虫框架则负责获取网页。
Beautiful Soup 能采集 JavaScript 网站的数据吗?
只有所需数据已包含在初始 HTML 中时才可以。对于由 JavaScript 生成的内容,可以用 Playwright 等浏览器工具渲染页面,或找到提供这些数据的网站 API。
Beautiful Soup 能使用代理吗?
可以,但代理需要在下载工具中配置,而不是在 Beautiful Soup 中配置。请求成功后,将下载的 HTML 交给 Beautiful Soup 即可。