我正在使用XPath在模板中找到一个节点(或接近它的东西),该模板具有大约10级深度的非格式良好的HTML。 (不,我没有写这个HTML ......但我的任务是挖掘它。)
我似乎能够使用Firefox的XPartner插件检索有问题的元素的XPath;但它只给了我在现场的位置,而不是我给出的模板。 (模板来自非标准的服务器端脚本语言;读取内部构建的语言)
你知道的任何XPath工具是否特别擅长混淆非格式化的HTML。
答案 0 :(得分:4)
无法使用非正确的XML文档评估XPath表达式,这正是描述的情况。
可以通过两个链式步骤完成此操作,第一步是将HTML转换为格式良好的XML,然后是第二步 - 应用XPath表达式。
因此,问题可以更精确地说明为“如何将HTML转换为XML,以便可以针对它评估XPath表达式”。
以下是两个好工具:
TagSoup是一个开源程序,是一个基于Java和SAX的工具,由John Cowan开发。这是一个用Java编写的兼容SAX的解析器,它不是解析格式良好或有效的XML,而是解析在野外发现的HTML:糟糕,讨厌和野蛮,尽管通常很短。 TagSoup专为那些必须使用某种理性应用程序设计来处理这些东西的人而设计。通过提供SAX接口,它允许将标准XML工具应用于最差的HTML。 TagSoup还包括一个命令行处理器,它可以读取HTML文件并生成干净的HTML或格式良好的XML,它与XHTML非常接近。 Taggle是TagSoup的商业C ++端口。
SgmlReader 是由Microsoft Chris Lovett开发的工具。 SgmlReader是任何SGML文档的XmlReader API(包括内置的HTML支持)。还提供了命令行实用程序,其输出格式良好的XML结果。 下载包含独立可执行文件和完整源代码的zip文件:SgmlReader.zip
The pure XSLT 2.0 Parser of HTML 由David Carlisle撰写。阅读它的代码对我们每个人来说都是一次很好的学习练习。
来自说明:
“d:htmlparse(字符串) d:htmlparse(字符串,命名空间,HTML模式)
一个参数形式相当于) d:htmlparse(字符串, 'http://ww.w3.org/1999/xhtml',真()))
使用一些内置的启发式方法将字符串解析为HTML和/或XML 控制暗示元素的开启和关闭。
它没有HTML DTD的完整知识,但确实有完整的列表 空元素和实体定义的完整列表。 HTML实体和 十进制和十六进制字符引用都被接受。注意html实体 即使html-mode = false()也会被识别。
元素名称是小写的(如果html-mode为true())并放入 命名空间参数指定的命名空间(可以用“”表示 除非输入具有明确的命名空间声明,否则无命名空间 哪种情况会受到尊重。
如果html-mode = true()“
,属性名称会小写阅读更详细的说明here。
答案 1 :(得分:0)
XPath不能直接使用HTML。 XPath与HTML的交互由任何软件/库将HTML解析为渲染树决定。这可能有助于直接搜索。