javax.xml.xpath 的 XPath 表达式不起作用

XPath expression for javax.xml.xpath not working

我想从这个网站提取内容:https://it.projektwerk.com/de/projects/

例如我有一个 XPath 表达式:.//*[@id='content_0']/H3/A (请注意,大写字母是正确的,因为我的文档解析器 -> org.cyberneko.html ... 将标签解析为那些大写字母)

这是一个有效的 XPath 表达式;例如,我可以使用 FirePath 获取内容。但是,使用 javax.xml.xpath 类,检索是不可能的。我是这样做的:

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(exprString);
Node node = expr.evaluate(doc, XPathConstants.NODE);

node 始终是 null

我不明白,因为还有其他网站使用相同语法的其他表达方式,这些网站有效(例如 .//*[@id='p_p_id']/DIV/DIV/DIV/DIV[3]/A/H3/SPAN

希望有人能提供帮助。

多亏了 VGR,我才得以了解这个问题。这些 Xpath 表达式不起作用的网站是一个命名空间感知网站,其 html 标记构造如下:

因为我正在使用HtmlCleaner,所以我使用了以下代码:

HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setNamespacesAware(false);
TagNode mainNode = cleaner.clean(htmlString);

根据文档,应该从 html 文档中删除名称空间属性。但这 行得通!令人惊讶的是,被测试的 html 文档的 html 标签内的 xmlns 属性只会改变其在属性列表中的位置。 因此解决方案是使用 HtmlCleaner 的 html 节点的 TagNode 表示从 htmlTag 中手动删除 xmlns 属性:

public TagNode removeNamespaceFromHtmlTag(TagNode htmlNode) {
    htmlNode.removeAttribute("xmlns");
    return htmlNode;
}

删除它,问题中定义的 XPath 表达式将 return 所需的结果。