【发布时间】:2016-10-05 16:13:27
【问题描述】:
我要提取这个网站的内容: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)
希望有人能提供帮助。
【问题讨论】:
-
通常,HTML 元素位于 HTML 命名空间中,即 URI 为
http://www.w3.org/1999/xhtml的命名空间。您需要调用 xpath.setNamespaceContext 以使 XPath 引擎知道该命名空间,然后将您的表达式更改为类似于.//*[@id='content_0']/html:H3/html:A。 -
感谢 VGR,它帮助我找到了解决方案,有关详细信息,请参阅下面的答案。