Java xpath解析无法正确解析
我编写了一个使用xpath解析html页面的小代码。我的问题是,该代码适用于某些页面,而不适用于其他页面。你能告诉我是什么导致了这样的问题吗?我做了一些调试,我的第一个猜测是我没有正确使用Html cleanerJava xpath解析无法正确解析,java,xpath,html-parsing,htmlcleaner,Java,Xpath,Html Parsing,Htmlcleaner,我编写了一个使用xpath解析html页面的小代码。我的问题是,该代码适用于某些页面,而不适用于其他页面。你能告诉我是什么导致了这样的问题吗?我做了一些调试,我的第一个猜测是我没有正确使用Html cleaner public static void main(String args[]) throws Exception { javax.xml.xpath.XPath xpath = XPathFactory.newInstance().newXPath();
public static void main(String args[]) throws Exception {
javax.xml.xpath.XPath xpath = XPathFactory.newInstance().newXPath();
try {
NodeList nodes = (NodeList) xpath.evaluate("html/body/div[3]/div/div[2]/div[1]/div[1]/div/h1", readDocument(),
XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getTextContent());
}
} catch (XPathExpressionException e) {
e.printStackTrace();
}
System.out.println("");
}
private static Document readDocument() throws IOException {
java.net.URL url = new java.net.URL(
"http://en-maktoob.news.yahoo.com/medical-team-asks-obese-saudi-wait-death-home-072857829.html");
java.net.URLConnection conn = url.openConnection();
conn.addRequestProperty("User-Agent",
"Mozilla/6.0 (Windows NT 6.2; WOW64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1");
BufferedReader reader = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "UTF-8"));
CleanerProperties props = new CleanerProperties();
props.setTranslateSpecialEntities(true);
props.setTransResCharsToNCR(true);
props.setOmitComments(true);
TagNode tagNode = new HtmlCleaner(props).clean(reader);
Document doc = null;
try {
doc = new DomSerializer(new CleanerProperties()).createDOM(tagNode);
return doc;
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
publicstaticvoidmain(字符串args[])引发异常{
javax.xml.xpath.xpath xpath=XPathFactory.newInstance().newXPath();
试一试{
NodeList nodes=(NodeList)xpath.evaluate(“html/body/div[3]/div/div[2]/div[1]/div[1]/div/h1”,readDocument(),
XPathConstants.NODESET);
对于(int i=0;i
这段代码应该提取xpath模式中的文本并简单地打印出来。但在所需的示例中,它不起作用
解决方案:我发现这个问题是因为我使用了绝对xpath,可能这次使用的是xpath,在浏览器中编译html页面后可以更改。使用相对xpath解决了主要问题,但我无法使用相对xpath访问html的某些部分,我需要使用绝对xpath。因此,我的问题是如何在java代码中使用html的编译版本?如果XPath不工作,这意味着在文档中找不到选择器。当你在浏览器中浏览一篇文章时,有时事情并不总是像看上去的那样。请记住,当您在浏览器中查看它时,JavaScript正在执行,很多时候这意味着重新排列或向DOM添加元素 您的XPath查询有点特定,您可能会幸运地使其更轻松一些,因此如果缺少一个
标记,它不会破坏整个查询。特别是在HTML中使用XPath时,您应该更多地依赖id
和class
属性。我认为您正在尝试获取页面标题,该标题直接位于id为mediaarticlehead
的元素下
使用此xpath/*[@id=“mediaarticlehead”]/div/h1
然而,当W3C已经用
标记:)解决了这个问题时,所有这些都是为了获得文章标题。在文档的
中查看,您将找到标题、描述以及可能指向文章图像的链接。能否添加一些关于“不起作用”的详细信息?不提取与xpath模式相关的特定内容。我确信xpath模式是正确的。例如,对于上面提到的示例节点。lenght()=0,因此它不会打印任何内容!很明显,如果您没有得到任何结果,那么XPath对于您的数据是不正确的。您的XPath看起来很像是使用某种XPath浏览器工具找到的,只是简单地复制了它。当浏览器解析网页时,很可能是Java连接的结构不同。尝试一个更基本的XPath,并显示它是否返回任何结果。XPath是正确的。我使用FirefoxFirebug插件来提取它们。我确实使用了其他工具,发现了相同的xpath。我应该提到,同样的过程也适用于某些网站。如果它是由于xpath,它不应该适用于所有网站!xpath是正确的,但它是绝对xpath,我指出我应该使用相对xpath来处理这种情况。