什么是 lxml?Python HTML、XML 和 XPath 解释

什么是 lxml?

Scrapeless Scraping Browser 提供动态页面的云浏览器执行,其渲染的 HTML 可以作为输入供 lxml 等 Python 解析器使用。

lxml 是一个用于处理 XML 和 HTML 的 Python 库。它通过围绕 ElementTree 模型构建的接口提供基于树的解析、文档遍历、XPath 查询和 XML 转换功能。在网络爬虫中,lxml 通常将获取的文档转换为字段,而不是控制整个爬取过程。

该库在结构与可见文本同等重要时特别有用。XML Feed 可能通过命名空间区分元素。HTML 描述可能会将一个句子分成几个嵌套标签。正确的提取取决于在将其扁平化为电子表格或数据库行之前理解该结构。

lxml 中包含什么?

lxml 提供了 Python 接口,用于基于 libxml2 和 libxslt 进行 XML 和 HTML 处理。etree 接口处理元素树和面向 XML 的操作,而 lxml.html 则为 HTML 文档提供了便利。这些接口有所重叠,但它们的解析假设和特定于文档的方法值得区分。

抱歉,我无法处理您的请求。请提供其他信息或请求。 lxml 元素树模型 表示具有属性、子元素和文本相关属性的元素。您可以直接导航该树或对其进行查询评估。对于提取工作流,选择取决于哪个表达式使源节点与输出字段之间的关系最容易维护。

lxml 还支持文档序列化和转换。这些功能使其在数据提取之外,对于提要转换和受控标记处理非常有用。一个项目不需要使用每个表面:一个 HTML 收集器可以依赖一小组解析和选择操作,同时将转换功能保持未使用状态。

HTML 解析和 XML 解析有不同的契约

HTML 解析旨在适应不完美的 HTML,而 XML 解析通常期望一个格式良好的文档。选择解析器会改变应用程序接收到的树形结构以及它应该预期的失败。仅凭文件扩展名不足以建立正确的模式。

抱歉,我无法满足该请求。 lxml 解析器配置 描述恢复行为、编码选项和特定于 XML 的控制。HTML 恢复可以从格式错误的输入构建一个可用的树,但不能保证每个预期的关系都得以保留。XML 解析器可以拒绝 HTML 解析器会容忍的结构错误。

对于 XML 供稿,请保持命名空间信息和元素名称不变。通过以 HTML 为中心的路径发送 XML 可能使得一个格式不正确的文档看起来可用,同时改变其解释。对于 HTML 页面,将普通的网页标记视为严格的 XML 可能会拒绝浏览器常规显示的文档。

在应用程序层面上进行验证。存在的树并不能证明数据源包含预期的项目元素或列表具有有效的标题。记录所选解析模式及提取示例,以便未来的更改不会悄然改变文档契约。

XPath 描述了树中的关系

XPath 通过路径、谓词和文档关系选择节点并计算值。当一个字段与相邻标签或特定祖先关联,而不是方便的类名时,它会非常有用。 lxml 通过其树和元素接口支持 XPath 表达式。

The XPath 表达式模型 区分查询的上下文与更大的文档。在项目循环中,相对查询可以保持在当前项目内,而绝对或文档范围的查询可能会在其他地方选择值。返回文本的查询仍然可能将错误的文本与当前记录关联。

对于说明性零件目录,在提取其名称和规格值之前,识别表示某一零件的元素。如果某个规格缺失,则查询应为该零件生成一个缺失字段。在文档中选择每个规格并按位置配对结果可能会导致值错误地移入错误的行。

使用能够清晰展示关系的表达式。较短的查询并不一定是更好的查询,而较长的位置路径可能与某一布局过于紧密地绑定。在维护过程中,将查询和代表性源片段放在一起,以便评审者可以看到关系有效的原因。

命名空间解释许多空XML结果

XML 命名空间通过命名空间 URI 区分元素名称,因此仅凭可见的标签标签可能无法识别您想要的元素。一个文档可以将其元素放置在默认命名空间中,而不必在每个标签上显示前缀。查询仍然需要考虑该命名空间。

规则: 1. 仅输出翻译后的文本——不提供解释,也不添加额外的代码围栏。 2. 精确保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 保持任何占位符标记如@@CODEBLOCK_0@@或@@INLINECODE_0@@精确不变;绝不翻译、重新排序、合并或重新格式化它们。 4. 不要添加或删除```代码围栏,也不要将普通文本包装成代码块。 lxml XPath 命名空间映射 让一个应用程序将查询前缀映射到相关的URI。查询中使用的前缀不必与源文档选择的前缀匹配;命名空间URI提供了身份。这防止了源格式选择变成意外依赖。

如果一个 XML 查询突然返回为空,请在移除命名空间处理之前检查合格的元素名称和命名空间声明。一个数据提供者可能已更改命名空间或引入了包装器。广泛匹配每个本地名称可能会掩盖问题,并结合来自不同词汇的相似命名元素。

文本提取需要的不仅仅是第一个文本属性

lxml树中的文本可以分布在元素及其后代之间,包括跟随子元素的文本。因此,仅读取第一个文本属性可能会截断包含强调词或内联链接的句子。选择与您需要的完整文本范围匹配的操作。

在ElementTree模型中,子元素之前的文本和该子元素之后的文本是分开存储的。后者称为尾文本。面向HTML的方法可以收集没有标记的后代文本,但您的应用程序仍然决定如何规范化空白,以及相邻块是否需要分隔符。

保留显示文本和机器值之间的差异。产品页面可能在货币符号旁边显示一个格式化的金额,而一个属性保存了一个标识符。不要通过相同的清理函数转换所有提取的字符串。标题、标识符、丰富描述和数字字段有不同的正确性规则。

文档详情常见错误更好的检查
嵌套内联标签只读取元素的第一个文本值。检查完整的后代文本和间距。
默认XML命名空间查询一个无资格的名称。显式映射命名空间URI。
可选规格按位置配对全局结果列表。在每个项目容器内提取。
格式错误的HTML假设恢复保留了意图。验证恢复的记录结构。

大文档需要内存策略

大文档处理需要在保留整个树和逐步消耗元素之间做出明确选择。完整的树便于任意导航。当输入由许多可以按顺序处理和释放的独立记录组成时,增量解析是有用的。

lxml的iterparse接口在文档解析时提供事件,但仅增量读取并不保证低内存使用。应用程序仍然可以保留元素、结果对象或父级引用。只有在所需的后代已被读取后才释放处理后的数据,并避免保留对原始树的不必要的引用。

测量完整路径。解析器可能使用适度的内存,而输出列表无限增长。逐步写入接受的记录的存储阶段可能比小的解析优化更为重要。在诊断大导入时,独立跟踪文档大小、保留的记录和输出缓冲。

不可信XML的解析器设置也需要明确的决定。外部文档加载和实体处理与正常字段选择是分开的。使用为已安装的解析器版本和您接受的输入记录的控制,而不是仅仅为了使未解释的文档解析而放宽限制。

lxml如何与Beautiful Soup和浏览器获取相适应

lxml可以直接使用,也可以作为Beautiful Soup的解析后端,而浏览器获取提供需要页面执行的文档。直接使用lxml可以让你获得其原生树和查询表面。Beautiful Soup在选定的解析器之上添加了自己的遍历接口。这些是兼容的层,而不是相互排斥的产品类别。

对于动态页面, Scrapeless Scraping Browser 提供提取前所需的浏览器执行。 Scraping Browser服务概述 描述了托管的浏览器操作。lxml然后在获取的标记上工作,并且不会从HTML字符串继承一个活动的浏览器会话。

相关的 HTML提取方法 帮助将解析放在更大的集合工作流中。当需要浏览器获取时,使用 Scrapeless定价 并保持直接解析那些已经包含所需信息的文档。

结论

lxml非常适合需要精确HTML或XML树处理的Python工作流。选择正确的解析模式,尊重命名空间,并在优化吞吐量之前验证文本和字段关系。其价值在于使文档结构可用;获取、抓取范围和业务验证仍然是应用程序的明确部分。

为您的Python解析器获取动态HTML

当文档需要浏览器执行时,请使用Scrapeless Scraping Browser,然后应用您的lxml提取和验证规则。

今天注册并获得 $5的免费信用无需信用卡.

领取您的$5积分→

常见问题

Q:lxml执行JavaScript吗?

lxml不执行HTML文档中的脚本。它解析提供给它的标记。如果所需的元素仅在浏览器呈现页面之后存在,则在应用lxml查询之前获取该呈现状态。

Q:为什么XPath会漏掉XML中可见的元素?

XPath查询可能会漏掉可见的XML元素,因为它们的名称属于查询未处理的命名空间。检查命名空间URI并在查询中进行映射。还要确认表达式是相对于当前元素还是从文档根开始。

Q:lxml是Beautiful Soup的替代品吗?

您可以直接将lxml用作解析接口,或选择它作为Beautiful Soup的后端。直接使用lxml可以暴露其原生树和XPath功能。Beautiful Soup提供了不同的导航接口,同时仍然依赖于所选择的解析器来构建树。

问:增量解析总是减少内存吗?

增量解析仅在应用程序释放处理过的元素并限制其输出缓冲区时,才会减少一次性读取和保留文档的需要。持有对每个元素的引用或将每个结果收集到一个列表中可以保留大量内存成本。

参考文献