我想从这个网站中提取内容:https://it.projektwerk.com/de/projects/
e.g。我有一个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
)
希望有人可以提供帮助。
答案 0 :(得分:0)
感谢VGR,我能够了解这个问题。那些Xpath表达式不起作用的网站是一个名称空间感知的网站,其中的html标签构造如下:
当我使用HtmlCleaner时,我使用了以下代码:
HtmlCleaner cleaner = new HtmlCleaner();
CleanerProperties props = cleaner.getProperties();
props.setNamespacesAware(false);
TagNode mainNode = cleaner.clean(htmlString);
根据文档,它应该从html文档中剥离命名空间属性。但这确实不工作!令人惊讶的是,测试的html文档的html标记内的xmlns属性只会更改其在属性列表中的位置。 因此,解决方案是使用html节点的HtmlCleaner的TagNode表示从htmlTag手动删除xmlns属性:
public TagNode removeNamespaceFromHtmlTag(TagNode htmlNode) {
htmlNode.removeAttribute("xmlns");
return htmlNode;
}
删除它,问题中定义的XPath表达式将返回所需的结果。