什么是BeautifulSoup?
Scrapeless Web Unlocker可以为使用BeautifulSoup作为解析层的Python程序返回公共页面的HTML。
TL;DR
- BeautifulSoup是一个用于解析HTML和XML的Python库。 它将标记呈现为一个可导航的树。
- BeautifulSoup不获取页面或执行JavaScript。 另一个组件必须提供标记。
- 解析器后端会影响树。 当文档格式不正确时,选择并锁定一个后端。
- 选择器需要记录边界。 在一个项目内查看字段并验证所需的值。
BeautifulSoup通常从beautifulsoup4包中导入为bs4,将标记解析为标签、属性和文本的树。Python代码可以搜索该树,遍历父节点和兄弟节点,并从选定元素中提取值。它对于将HTML页面视为结构化内容而不是将其视为未加区分的字符串是非常有用的。
该库有一个精确的边界。它本身不执行HTTP请求,解析一个<script>标签并不会执行该脚本。必须由HTTP客户端、本地文件或渲染器提供HTML。结果的质量因此依赖于该边界的两侧:你获取的表现形式和你为其编写的选择器。
BeautifulSoup如何将标记转化为树
解析器读取标记并为元素和文本创建节点。BeautifulSoup将这些节点暴露为标签和可导航字符串,并提供方法和属性以便在层次结构中移动。 官方Beautiful Soup文档 解释搜索方法、CSS选择器、属性和树导航。树是提供的标记的模型,而不是一个实时浏览器DOM。
想象一个带有文章包装、标题、链接和价格跨度的产品卡。BeautifulSoup可以找到文章,然后仅在该文章内部搜索字段。这保持了值之间的关系。如果缺少价格,卡片仍然是一个记录,缺少可选字段,而不是导致每个后来的价格与错误标题配对。
解析器还可以暴露评论、脚本和隐藏的标记。在没有理解上下文的情况下选择每个文本节点可能会将导航、法律通知或嵌入数据拉入结果。从一个有意义的容器开始,并编写一个小的方案。一个好的选择器是一个关于哪个页面结构表示你想要的记录的声明。 HTTP表现模型 提醒我们在信任解析器之前检查接收的主体及其元数据。
解析器后端和格式不正确的HTML
BeautifulSoup将解析委托给一个后端。Python内置的html.parser随时可用;其他后端可能具有不同的安装要求和修复行为。无效的嵌套、遗漏的闭合标签和不寻常的文档片段可能会导致在不同解析器下生成不同的树。在代码中锁定后端,并针对代表性的源标记进行测试,而不是依赖于任何可能已安装的解析器。
Python的 html.parser参考 描述了一个低级事件驱动接口。BeautifulSoup在所选解析器上提供一个更高级的搜索和导航层。当项目需要考虑一个特定格式不正确的文档时,这一区别很重要:切换后端可能会改变标签的父级,尽管可见的浏览器页面看起来相似,但这会改变作用域选择器。
浏览器可能会根据自己的解析规则修复HTML,然后让JavaScript再次修改DOM。因此,BeautifulSoup解析原始响应可以生成与浏览器执行后捕获的快照不同的树。在指责选择器之前,比较传递给解析器的确切输入与在开发者工具中检查的标记。
查找、查找所有和CSS选择
find返回搜索范围内第一个匹配的元素,而find_all返回匹配项。select将CSS选择器应用于树,select_one返回一个匹配的元素。选择能够清楚地表达问题的形式。简单的标签和属性条件可能使用find更为适合;例如一个卡内部的链接关系可能作为CSS选择器读起来更好。
选择器应保持简短且有意义。语义化的文章标签、稳定的数据属性或已知的标题关系往往比生成的类链更不易出错。当一个项目可以有多个链接时,识别与方案相匹配的角色,而不是取第一个锚点。检查锚点文本和目标。对最终页面URL进行相对href解析,以避免生成缺失的记录。
文本规范化是一个单独的操作。get_text可以收集后代文本,但间隔和隐藏内容需要审核。在精确标点、单位或货币重要的情况下,保留原始字符串;对于分析使用规范化显示值。select的结果是节点列表,而不自动形成有效的数据集。
在选择链接时,区分显示文本和目标。一个卡片可以包含不同目标的导航链接、图像链接和操作链接。选择与记录键对应的那个,对其进行最终页面URL解析,并验证主机或路径。如果页面有一个规范链接,不要期望每个卡的href已经是规范的。保留原始href和规范化URL可以使后来的源更改更容易诊断。
BeautifulSoup无法做到的事情
BeautifulSoup无法使页面执行JavaScript、打开浏览器会话、点击控件或等待网络响应。如果初始HTML缺少目标记录,该库将忠实地解析该不完整的文档。首先检查是否存在适当的结构化端点包含数据;如果没有,使用支持浏览器的路径获取呈现的HTML。
The Web Unlocker JS Render documentation 描述了一种可以返回HTML的浏览器执行选项。然后,BeautifulSoup可以解析返回的标记。这种分工是有用的:获取解决了访问和渲染,而Python解析器负责字段选择和规范化。你仍然需要验证渲染结果是否达到预期页面状态。
解析树也无法确定是否允许集合。站点条款、隐私义务和操作负载属于周围的工作流程。它也无法决定价格是否最新或标题是否为正确的产品标题,而不需要记录级别的接受规则。将解析器视为一种结构工具,而不是商业真相的保证。
一个可靠的BeautifulSoup工作流程
首先定义输出字段和所需的页面标记。获取一个允许的页面,检查最终URL、状态和媒体类型,并检查主体的样本。然后创建一个带有显式解析器的soup。选择记录容器并读取每个容器内部的字段。规范化值、解析URL、验证所需字段并记录被拒绝的项目。当用例需要可追溯性时,保存带有源上下文的被接受记录。
对于重复提取,保持两个检查。解析器级测试使用保存的代表性标记来验证选择器。一小段实时获取检查确认当前页面仍返回预期的身份和结构。如果只有解析器测试通过,新的登录墙或更改的响应仍然可能使生产工作为空。如果只有实时测试通过而没有字段检查,工作可以安静地存储错误值。
解析器输出也需要显式限制。一个具有非常大正文或深度嵌套的格式错误标记的页面可能会消耗令人惊讶的时间和内存。在获取层设置一个合理的响应大小限制,并避免在足够的范围元素时收集整个页面文本。这使得解析步骤可预测,同时在源页面超出预期形状时留下明确的诊断。
The Web Unlocker product page 描述了公共页面的获取,而相关的 BeautifulSoup guide 介绍了静态和动态获取选择。使用这些选择使解析器保持简单:它应该接收正确的HTML并返回一个经过验证的记录,而不是猜测页面是如何达到该状态的。
结论
BeautifulSoup是一个实用的Python接口,用于HTML或XML解析树。它的优点是搜索、遍历和从已提供的标记中提取。选择一个解析器后端,将选择器限定于记录,并验证页面获取路径,然后才能相信生成的数据集。
将HTML获取连接到Python解析
使用文档化的Scrapeless获取路径,并将一个经过验证的响应解析为一个小的记录模式。
立即注册并获得 $5的免费积分 — 无需信用卡.
Claim Your $5 Credit →常见问题
BeautifulSoup是一个网页浏览器吗?
不。BeautifulSoup将提供的标记解析为可导航的树。它不执行脚本、管理实时页面或点击控件。浏览器或渲染器是一个独立的获取组件。
BeautifulSoup会获取一个URL吗?
不。使用HTTP客户端、本地文件或渲染服务首先获取标记。确认响应是预期的页面,然后再将其内容传递给BeautifulSoup。
我应该使用哪种BeautifulSoup方法?
使用find或find_all进行直接标签和属性查询,使用select或select_one进行CSS样式结构查询。选择能够明确记录边界的方法,并对代表性标记进行测试。
解析器选择会改变结果吗?
是的。后端可以以不同的方式修复格式错误的HTML,产生不同的父子关系。固定选择的解析器并对工作流程实际接收的页面种类测试选择器。
BeautifulSoup能解析呈现的HTML吗?
是的。一旦支持浏览器的组件提供最终的HTML快照,BeautifulSoup就可以解析它。它并不执行渲染,工作流程仍必须确认快照包含预期状态。