什么是 HTML 解析?
Scrapeless 通用抓取 API 检索并渲染公共页面 HTML,以便下游解析器可以将其转换为可查询的文档树。
简而言之
- HTML 解析将标记转换为文档树。 元素、属性、文本和注释变成代码可以遍历或查询的节点。
- HTML 使用自己的错误处理规则。 浏览器可以从不符合 XML 格式的标记构建可用的 DOM。
- 解析不会执行页面 JavaScript。 解析器读取提供的标记;可能需要浏览器运行时才能获取后渲染的 DOM。
- 选择器在解析后操作。 CSS 选择器和 XPath 在树中定位节点;提取然后读取和标准化它们的值。
HTML 解析是读取 HTML 源代码并构建结构化文档树的过程。结果是一个文档对象模型,或 DOM,包含元素节点、文本节点、属性、注释,以及父节点、子节点和兄弟节点之间的关系。
该 WHATWG HTML 标准 定义了文本/html 资源的标记和树构造行为。这些规则解释了源标记和结果 DOM 之间的关系,但并不总是相同。
HTML 解析是如何工作的?
HTML 解析会将标记标记化并应用树构建规则以创建一个 DOM。
- 读取字符。 解析器将 HTML 输入作为流进行消费。
- 创建标记。 开始标签、结束标签、文本、注释和文档类型声明变成标记。
- 构建树。 插入模式和开放元素规则决定每个标记属于哪里。
- 纠正可恢复标记。 解析器可以隐含元素、关闭开放元素或根据标准重新定位节点。
- 暴露 DOM。 代码可以遍历结果节点或使用支持的选择器 API 查询它们。
HTML 解析与渲染
解析创建文档树;渲染计算布局并绘制可视页面。
| 阶段 | 输入 | 输出 |
|---|---|---|
| 提取 | URL 和请求设置 | HTTP 响应字节 |
| 解析 | HTML 文本 | DOM 树 |
| 脚本执行 | DOM 和 JavaScript | 潜在修改的 DOM |
| 渲染 | DOM、CSS、布局状态 | 像素和交互呈现 |
| 提取 | DOM或结构化响应 | 选定记录 |
MDN的浏览器管道指南 描述了标记化、树构建,以及解析与阻塞脚本之间的交互。
对于内存中的字符串, DOMParser.parseFromString() 显示了将HTML或XML源转换为文档的浏览器API形状。
为什么HTML解析对网络抓取很重要?
HTML解析为抓取器提供了一种结构模型,比以纯文本搜索原始标记要安全和精确。
字段选择
通过结构和属性定位产品卡、标题、表格、链接和元数据。
文本清理
阅读文本内容而不保留标签、评论或不相关的导航标记。
链接解析
提取href属性并根据文档基准解析相对URL。
内容验证
检查所需元素是否存在,以及选定节点是否具有预期的关系。
常见的HTML解析错误
大多数解析失败来自使用错误的输入、假设XML规则或将提取与脆弱的布局细节耦合。
- 在数据稍后出现时解析初始响应。 在JavaScript创建内容时检查渲染的DOM或结构化网络响应。
- 将HTML视为良构的XML。 使用HTML解析器处理text/html,因为HTML有不同的校正规则。
- 使用广泛的正则表达式搜索标记。 解析树,然后通过结构和稳定属性选择节点。
- 假设每个页面都有每个模块。 将可选元素建模为可为空,并在提取前验证页面类型。
标记化期间发生了什么?
标记化读取输入字符流,并识别如开始标签、结束标签、字符数据、评论和文档类型等结构。标记化器保持状态,因为相同的字符在普通文本、属性值、评论、原始文本元素或脚本数据中可能意味着不同的内容。
字符引用根据HTML规则被解析,属性附加到标签令牌,解析错误在不必停止文档的情况下处理。这种行为是HTML解析器优于简单字符串分割的原因之一。脚本中的小于号或文本中的和符号在没有上下文的情况下无法正确解释。
仅标记化不会产生最终的元素层次结构。令牌为树构建阶段提供数据,该阶段决定节点属于哪里以及错误或省略的标记如何影响文档结构。
树构建如何纠正HTML?
树构建使用插入模式和打开元素的堆栈来创建DOM。算法可以推断缺失的元素,在新的令牌使先前的嵌套无效时关闭元素,并处理特殊上下文,如表格。因此,DOM可以包含在源文本中未显式编写的节点或关系。
表格标记是一个常见的例子。内容放置在无效位置时可以根据解析规则移动。当某些块级元素开始时,段落元素也可以隐式关闭。提取逻辑应检查解析后的树,而不是根据缩进或快速阅读源标记推断嵌套。
不同的解析器库旨在实现HTML标准,但可能暴露不同的API和合规水平。如果精确树形状对管道很重要,请测试实际库与典型的无效页面。
编码和内容类型如何影响解析?
解析器需要正确的字符编码将响应字节转换为字符。错误的编码可能在树构建开始之前损坏名称、价格、标点符号和与选择器相关的属性值。尊重可靠的响应元数据和解析器的文档编码检测行为。
内容类型也很重要。HTML和XML有不同的解析规则和错误行为。XML通常需要良构的输入和命名空间感知处理,而HTML定义了对常见标记错误的恢复行为。将text/html传递给XML解析器可能会拒绝浏览器显示的页面,而将XML传递给HTML解析器可能会丢失命名空间或大小写语义。
记录最终的响应内容类型和URL以及捕获。一个名义上的页面URL可能根据请求上下文返回JSON、下载、访问页面或其他格式。仅在检查服务实际返回内容后选择解析器。
脚本如何与解析器交互?
在浏览器中,某些脚本元素在代码被获取和执行时可以暂停HTML解析。该代码可以检查部分构建的DOM、写入附加标记或安排后续更改。其他脚本以不阻塞的方式加载,并可能在初始解析完成后更新页面。
独立解析器仅通过构建初始树并不会重现应用程序生命周期。如果所需数据由脚本插入,则提取工作流需要浏览器或包含相同信息的结构化响应。正确的输入可能是渲染后的DOM,但也可能是渲染过程中观察到的API响应。
选择一个与目标内容相关的完成条件。仅文档加载可能在客户应用程序完成其数据请求之前发生,而持续的分析流量可能使网络空闲条件不适用。与所需模块关联的元素、响应或应用程序状态更具意义。
如何测试HTML解析器以进行提取?
解析器测试应包括有效标记、省略标签、无效嵌套、实体、评论、表格、脚本、非ASCII文本和空文档。比较结果树与提取规则所需的行为,而不是仅仅测试解析是否在没有异常的情况下返回。
提取测试应基于解析树进行操作,并断言记录边界、字段文本、属性和可选模块。包括源代码和DOM不同的页面,以便团队知道规则是否期待服务器HTML或渲染的HTML。
当解析器或库版本更改时,重新运行代表性语料库。树的纠正、小的文本标准化或选择器支持的差异都可能改变提取的记录。将解析和提取堆栈与架构一起版本化,以便更改的来源保持可追踪。
结论
HTML解析将标记转换为浏览器和提取工具可以查询的DOM。可靠的提取从选择正确的输入—源HTML或渲染HTML开始,然后在结果树上使用结构选择器和架构验证。
准备好构建您的Web数据工作流了吗?
使用Scrapeless检索公共Web内容,然后应用适合您数据集的发现和提取模式。
开始免费→常见问题解答
HTML解析与网络抓取是否相同?
不相同。HTML解析构建文档树;网络抓取还包括检索、选择、清理、验证和存储。
HTML解析器是否运行JavaScript?
独立的HTML解析器通常不会执行JavaScript。浏览器运行时可以执行脚本并公开结果DOM。
为什么DOM可能与页面源不同?
HTML解析器可以纠正标记并隐含元素,而JavaScript在解析后可以添加、删除或更改节点。
可以在不解析HTML的情况下使用CSS选择器吗?
CSS选择器在文档树上操作,因此标记必须首先被解析或通过已暴露DOM的环境提供。