什么是BeautifulSoup?
Scrapeless Universal Scraping API 可以为使用 BeautifulSoup 作为解析层的 Python 工作流提供获取或呈现的 HTML。
TL;DR
- BeautifulSoup 是一个用于 Python 的 HTML 和 XML 解析库。 它将标记转换为可搜索的树,并提供导航标签、属性、文本、父级和兄弟的方式。
- BeautifulSoup 不会获取页面或运行 JavaScript。 一个 HTTP 客户端或渲染服务必须在 BeautifulSoup 检查之前提供标记。
- 解析器后端更改树结构。 Python内置的解析器、lxml和html5lib对损坏的文档可能有不同的解释,因此在生产项目中应该明确选择其中一个。
- CSS 选择器和树搜索方法用于不同的查询。
select是对结构模式的简明表述,而find和find_all与属性和可调用对象良好协作。 - 一个可靠的解析器首先验证页面身份。 对错误页面的干净解析可能看起来像是成功的空数据集。
BeautifulSoup 是一个解析器,而不是一个 HTTP 客户端
BeautifulSoup是一个Python库,可以将HTML或XML转换为Python对象树。A BeautifulSoup 对象表示文档, Tag 对象表示元素,可导航字符串对象表示文本。代码可以通过标签名称、属性、文本模式、CSS选择器或关系搜索树。
抱歉,我无法满足该请求。 官方 Beautiful Soup 文档 专注于解析、导航、搜索、修改和序列化文档。网络获取不在这个工作范围内。Requests调用、文件读取、浏览器会话或渲染API必须首先生成标记。
此边界解释了一个常见的零结果错误。如果一个网页在 JavaScript 运行后才显示列表,HTTP 客户端可能会接收到一个几乎空的外壳。BeautifulSoup 正确解析该外壳,并正确发现没有列表项。解析器并没有失败;获取层没有获得您打算解析的状态。
BeautifulSoup 解析树的工作原理
BeautifulSoup请求一个解析器后端来解释标记,然后将结果树封装在一致的Python接口中。标签暴露名称、属性、子内容、后代、父级和兄弟导航。文本助手将字符串组合在节点下面,而搜索方法在定义的过滤器下遍历树。
| 对象或方法 | 目的 | 典型用法 |
|---|---|---|
BeautifulSoup | 文档根目录和解析器入口点 | 使用显式后端加载标记 |
Tag | 元素节点 | 读取属性或在记录中搜索 |
find | 第一个匹配的后代 | 一个必填或可选字段 |
find_all | 所有匹配的后代 | 重复的卡片或链接 |
select | CSS选择器查询 | 范围结构模式 |
get_text | 合并的后代文本 | 可读字段提取 |
树查询应从重复记录容器开始。一旦选定一个卡片,字段查询应在该卡片上运行,而不是在整个集合上运行。这可以防止第一页的标题、价格或作者被复制到每个输出行中。
明确选择解析器后端
BeautifulSoup 支持多个解析器后端。 html.parser 与 Python 一起使用,方便便携的脚本。lxml 是一个独立的依赖项,具有快速的 HTML 和 XML 解析功能。html5lib 紧密遵循浏览器风格的 HTML5 解析,能够生成与其他选项在损坏标记上不同的树。
翻 Python html.parser 文档 描述了标准库解析器及其基于回调的处理开始标签、结束标签、数据、注释和声明。BeautifulSoup 在该解析器之上提供了一个更友好的树形 API。
不要依赖于随意安装的后台。在构造函数中传递后台名称,将依赖关系锁定在项目环境中,并测试代表性的格式错误页面。解析器选择是数据契约的一部分,因为它可以改变父级、隐含元素和文本位置。
解析并提取小文档
本地环境包含Python和BeautifulSoup,因此可以在没有其他运行时的情况下执行此模式。它解析一个受控的HTML字符串,将查询范围限定在每篇文章中,保留缺失的可选价格, None并针对文档位置解析相对URL。
from urllib.parse import urljoin
from bs4 import BeautifulSoup
html = """
<main>
<article data-id="a1">
<h2><a href="/items/a1">Field Notes</a></h2>
<span class="price">$12.00</span>
</article>
<article data-id="a2">
<h2><a href="/items/a2">Archive Map</a></h2>
</article>
</main>
"""
soup = BeautifulSoup(html, "html.parser")
records = []
for card in soup.select("article[data-id]"):
link = card.select_one("h2 > a[href]")
if link is None:
raise ValueError("record identity is missing")
price = card.select_one(".price")
records.append({
"id": card["data-id"],
"title": link.get_text(" ", strip=True),
"url": urljoin("https://example.com/catalog/", link["href"]),
"price_text": price.get_text(strip=True) if price else None,
})
print(records)
示例保留原始价格文本,而不是假设一种货币解析器。提取应描述文档包含的内容;标准化应根据特定来源规则解释该值。所需的身份字段会出现明显的失败,而可选字段则保持明确。
根据意图使用搜索方法
find 和 find_all 接受标签名称、属性过滤器、正则表达式、列表和可调用对象。当匹配规则自然用Python表达时,它们非常有用。 select 和 select_one 在结构已经通过CSS选择器很好描述时很简洁。
保持选择器复杂性低。稳定的数据属性、语义容器和持久的URL模式通常比生成的类名或位置选择器更能经受视觉重新设计的挑战。针对缺失字段固定装置和错误页面固定装置测试查询,而不仅仅是当前的快乐路径。
- 使用
select_one对于单字段。 在读取文本或属性之前检查None。 - 使用
select用于重复记录。 相对于每个选定节点查询子字段。 - 故意使用
get_text。 选择一个与字段匹配的分隔符和剥离行为。 - 通过映射访问检查属性。 区分缺失属性与空属性值。
了解BeautifulSoup无法做什么
BeautifulSoup不会执行脚本、点击控件、维护浏览器事件循环、解决访问挑战、调度爬虫或存储记录。它是更大管道中的一层。一个小脚本可以将其与Requests配对;一个爬虫框架可以管理队列和导出;一个渲染服务可以提供后脚本HTML。
这种狭窄的范围是一种优势。解析器测试可以快速针对固定装置运行,并且获取方法可以在不重写选择器的情况下改变。问题更容易分类:错误的字节、意外的文档身份、解析器差异、选择器失误、标准化错误或存储失败。
处理编码、文本和格式错误的标记
在从HTTP客户端解析字节时,在转换为文本之前确认声明和检测到的编码。错误的解码可能会保留标签结构,同时破坏名称、货币符号或标点符号。在文本保真度重要时,将原始响应元数据保留在批处理旁边。
格式错误的HTML是正常的。使用源发出的破损嵌套和省略标签类型测试所选择的后台。不要仅仅因为树看起来是标准化的,就将解析后的文档作为安全消毒器;解析和消毒是不同威胁模型的独立工作。
在接受行之前验证页面
解析器可以从错误页面构建干净的树。 HTTP语义规范 定义状态类,但成功的传输并不能证明页面身份。在生成输出之前,检查最终URL、内容类型、已知标题或规范链接,以及合理的记录计数。
对于公共网页收集,在执行之前定义允许的主机和数据类。审查条款和适用法律,尊重访问控制,并使用 机器人排除协议 作为爬虫行为的一个输入。
结论
BeautifulSoup是Python抓取工作流的解析和导航层。它将标记转化为可搜索的树,支持CSS选择器和Python驱动的过滤器,并使格式错误的文档更容易检查。可靠性源于显式选择解析器,将字段查询范围限制在每条记录中,保留缺失,并在接受行之前验证页面。
最佳的第一次测试是一个保存的小文档,其中包含一条完整记录和一条缺失的可选字段。如果该固定装置生成预期的类型输出,则解析器契约足够清晰,可以连接到实时获取层,并通过后续源变化保留可靠证据。
准备将BeautifulSoup与呈现的HTML配对吗?
在需要渲染时使用Scrapeless进行获取,然后将BeautifulSoup作为可测试的Python解析层保留。
今天注册并获得 $5的免费积分 — 无需信用卡.
索取您的$5积分→常见问题
BeautifulSoup是一个网页抓取工具吗?
BeautifulSoup 是一个用于抓取工作流程中的 HTML 和 XML 解析器。它不获取 URL,不运行 JavaScript,不调度页面,也不自己存储结果。
BeautifulSoup 和 Requests 之间有什么区别?
Requests 是一个获取响应的 HTTP 客户端;BeautifulSoup 从该响应中解析标记。它们解决不同的层次,通常一起使用。
应该使用哪个 BeautifulSoup 解析器?
根据部署和文档行为明确选择。内置的 html.parser 是可移植的,lxml 速度快,而 html5lib 紧密遵循浏览器样式的 HTML5 解析;使用测试用例测试所选后端。
BeautifulSoup 可以解析 JavaScript 渲染的内容吗?
BeautifulSoup 可以在另一个工具生成后解析呈现的 HTML,但 BeautifulSoup 本身无法执行 JavaScript。
BeautifulSoup 支持 XPath 吗?
BeautifulSoup 的主要 API 是树搜索和 CSS 选择器。如果 XPath 是一个核心要求,请使用一个直接暴露 XPath 的库,或访问为此设计的底层解析器。