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 所需的结果。
我想从这个网站提取内容: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 所需的结果。