使用 XML 解析器解析 html 文档

Posted

技术标签:

【中文标题】使用 XML 解析器解析 html 文档【英文标题】:Parsing an html document using an XML-parser 【发布时间】:2015-12-10 22:25:41 【问题描述】:

我可以使用 XML 解析器解析 html 文件吗?

为什么我不能(不能)这样做。我知道 XML 用于存储数据,而 HTML 用于显示数据。但在语法上它们几乎相同。

预期用途是制作 HTML 解析器,它是网络爬虫应用程序的一部分

【问题讨论】:

只要您的 html 是严格的 XML(例如 XHTML 1.0),您就可以这样做。否则,HTML 不是严格意义上的 XML,因此解析器会引发错误。 【参考方案1】:

您可以尝试使用 XML 解析器解析 HTML 文件,但很可能会失败。原因是 HTML 文档可以具有以下 XML 解析器无法理解的 HTML 特性。

从不具有结束标签并且不使用 XML 所谓的“自闭合标签语法”的元素;例如,<br><meta><link><img>(也称为void 元素) 不需要结束标签的元素;例如,<p> <dt> <li>(它们的结束标签可以隐含) 元素可以包含非转义标记<”字符;例如,styletextareatitlescript<script> if (a < b) … </script>, <title>Using the "<" operator</title> 具有未引用值的属性;例如,<meta charset=utf-8> 的属性,根本没有单独的值;例如,<input disabled>

XML 解析器将无法解析任何使用这些功能的 HTML 文档。

另一方面,HTML 解析器基本上不会失败,无论文档包含什么内容。


尽管如此,在开发一种新的 XML 解析类型方面也做了一些工作:所谓的 XML5 解析,即使在 XML 文档中也能够处理空/不带引号的属性等内容。有draft XML5 specification,还有as an XML5 parser, xml5ever。


预期用途是制作 HTML 解析器,它是 Web 的一部分 爬虫应用

如果您要创建一个网络爬虫应用程序,您绝对应该使用 HTML 解析器,最好是符合 parsing requirements in the HTML standard 的 HTML 解析器。

如今,许多(甚至大多数)语言都有这样的符合标准的 HTML 解析器;例如:

parse5 (node.js/javascript) html5lib (python) html5ever(生锈) validator.nu html5 parser (java) gumbo (c, with bindings for ruby, objective c, c++, per, php, c#, perl, lua, D, julia…)

【讨论】:

【参考方案2】:

在语法上它们几乎相同

计算机很挑剔。 “几乎相同”还不够好。 HTML 允许 XML 不允许的东西,因此 XML 解析器将拒绝(许多,但不是全部)HTML 文档。

此外,还有不同的质量文化。对于 HTML,解析器的文化是“尽可能对输入做一些事情”。对于 XML,文化是“如果它有问题,请将其送回维修或更换”。

【讨论】:

以上是关于使用 XML 解析器解析 html 文档的主要内容,如果未能解决你的问题,请参考以下文章

PHP-XML基于流的解析器及其他常用解析器

笔记:XML-解析文档-流机制解析器(SAXStAX)

Android之解析XML格式数据

在BlackBerry中使用SAX解析器解析XML

高级特性- XML

用于操作/编辑现有 xml 文档的最佳 java Xml 解析器