使用 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>
(它们的结束标签可以隐含)
元素可以包含非转义标记“<
”字符;例如,style、textarea、title、script; <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 文档的主要内容,如果未能解决你的问题,请参考以下文章