使用XPath包含Java中的HTML

我正在使用java程序中的XPath从HTML页面中抓取值来获取特定标记,偶尔使用正则表达式来清理我收到的数据。

经过一些研究,我将HTML Cleaner( http://htmlcleaner.sourceforge.net/ )作为将原始HTML解析为良好XML格式的最可靠方法。 但是,HTML Cleaner只支持XPath 1.0,我发现自己需要像’contains’这样的函数。 例如,在这段XML中:

Hello

我希望能够通过以下XPath获取文本“Hello”:

 //div/td[contains(@id, 'foo')]/text() 

有没有办法获得这个function? 我有几个想法,但如果我不需要,我宁愿不重新发明轮子:

  • 如果有办法调用HTML Cleaner的evaluateXPath并返回TagNode(我还没有找到),我可以在返回的TagNode上使用XML序列化程序并将XPath链接在一起以实现所需的function。
  • 我可以使用HTML Cleaner清理XML,将其序列化为字符串,并将其与另一个XPath库一起使用,但我找不到适用于字符串的优秀java XPath评估程序。
  • 使用像getElementsByAttValue这样的TagNode函数,我基本上可以重新创建XPath评估并使用String.contains插入包含function

简短的问题:有没有办法在现有Java库中使用HTML包含HTML?

关于这个:

我可以使用HTML Cleaner清理XML,将其序列化为字符串,并将其与另一个XPath库一起使用,但我找不到适用于字符串的优秀java XPath评估程序。

正是我要做的(除了你不需要对字符串进行操作(见下文))。

很多HTML解析器试图做太多 。 例如,HTMLCleaner没有正确/完全实现XPath 1.0规范( contains (例如) 一个XPath 1.0函数 )。 好消息是你不需要它。 HTMLCleaner所需要的只是解析格式错误的输入。 完成后,最好使用标准XML接口来处理生成的(现在格式良好的)文档。

首先将文档转换为标准的org.w3c.dom.Document如下所示:

 TagNode tagNode = new HtmlCleaner().clean( "
"); org.w3c.dom.Document doc = new DomSerializer( new CleanerProperties()).createDOM(tagNode);
Hello

然后使用标准的JAXP接口来查询它:

 XPath xpath = XPathFactory.newInstance().newXPath(); String str = (String) xpath.evaluate("//div//td[contains(@id, 'foo')]/text()", doc, XPathConstants.STRING); System.out.println(str); 

输出:

 Hello