4

我正在使用 XPath 在模板中定位一个节点(或接近它的东西),该模板具有大约 10 级深度的非格式良好的 HTML。(不,我没有写这个 HTML ......但我的任务是挖掘它。)

我似乎能够使用 Firefox 的 XPartner 附加组件检索相关元素的 XPath;但是它只给了我在实时站点中的位置,而不是在给我的模板中。(模板来自非标准的服务器端脚本语言;阅读内部构建的语言)

您知道有没有特别擅长处理非格式良好的 HTML 的 XPath 工具。

4

2 回答 2

4

XPath 表达式不能针对非格式良好的 XML 文档进行评估,这正是所描述的情况。

可以通过两个链接的步骤来执行此操作,第一个是将 HTML 转换为格式良好的 XML,然后是第二个 - 应用 XPath 表达式。

因此,这个问题可以更准确地表述为“如何将 HTML 转换为 XML,以便可以针对它评估 XPath 表达式”。

这里有两个很好的工具:

  1. TagSoup是一个开源程序,是一个基于 Java 和 SAX 的工具,由John Cowan开发。这是一个用 Java 编写的符合 SAX 的解析器,它不是解析格式良好或有效的 XML,而是解析在野外发现的 HTML:糟糕、肮脏和野蛮,尽管通常很不短。TagSoup 是为那些必须使用某种看似合理的应用程序设计来处理这些东西的人设计的。通过提供 SAX 接口,它允许将标准 XML 工具应用于甚至最糟糕的 HTML。TagSoup 还包括一个命令行处理器,它可以读取 HTML 文件,并且可以生成干净的 HTML 或与 XHTML 非常接近的格式良好的 XML。Taggle 是 TagSoup 的商业 C++ 端口。

  2. SgmlReader是微软的Chris Lovett开发的一个工具。SgmlReader 是任何 SGML 文档(包括对 HTML 的内置支持)的 XmlReader API。还提供了一个命令行实用程序,用于输出格式良好的 XML 结果。下载包含独立可执行文件和完整源代码的 zip 文件: SgmlReader.zip

  3. 由David Carlisle编写的纯 XSLT 2.0 HTML 解析器。阅读它的代码对我们每个人来说都是一个很好的学习练习。

从描述:

"d:htmlparse(string) d:htmlparse(string,namespace,html-mode)

一种参数形式等价于) d:htmlparse(string,' http://ww.w3.org/1999/xhtml ',true()))

使用一些内置的启发式方法将字符串解析为 HTML 和/或 XML 以)控制元素的隐含打开和关闭。

它没有完整的 HTML DTD 知识,但有完整的空元素列表和完整的实体定义列表。HTML 实体,以及十进制和十六进制字符引用都被接受。请注意,即使 html-mode=false(),也可以识别 html-entities。

元素名称是小写的(如果 html-mode 为 true())并放置在由命名空间参数指定的命名空间中(可能是 "" 表示无命名空间,除非输入有明确的命名空间声明,在这种情况下,这些将被尊重.

如果 html-mode=true()",属性名称是小写的

在此处阅读更详细的说明。

于 2008-12-10T02:21:20.793 回答
0

XPath 不能直接用于 HTML。XPath 与 HTML 的交互取决于将 HTML 解析为呈现树的任何软件/库。这可能有助于适当地指导您的搜索。

于 2008-12-09T22:40:11.393 回答