我编写了一小段代码,用于使用xpath解析html页面。我的问题是,这段代码适用于某些页面,而不适用于其他一个。你能告诉我是什么原因导致了这样的问题吗?我做了一些调试,我的第一个猜测是我没有正确使用Html cleaner。
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;
}
这段代码应该提取xpath模式中的文本并简单地打印出来。但在所需的示例中不起作用。
解决方案:我发现这个问题是由于我使用了绝对xpath,可能这一次的xpath可以在浏览器中编译html页面后更改。使用相对xpath解决了主要问题,但我无法使用相对xpath到达html的某些部分,我需要使用绝对xpath。所以我的问题是我如何在我的java代码中使用html的编译版本?
如果XPath不起作用,则意味着在文档中找不到选择器。当您在浏览器中查看文章时,有时事情并不总是像看起来那样。请记住,当您在浏览器中查看它时,JavaScript正在执行,并且很多时候这意味着重新排列或向DOM添加元素。
您的XPath查询有点特定,您可能会有更好的运气使它更轻松一点,所以如果一个<div>
标记丢失,它不会破坏整个事情。特别是在HTML中使用xpath时,您应该更多地依赖id
和class
属性。我认为您试图获得直接在id为mediaarticlehead
的元素下的页面标题。
使用此xpath //*[@id="mediaarticlehead"]/div/h1
.
然而,当W3C已经用<meta>
标签解决了这个问题时,这一切都得到了一个文章标题:)。查看文档的<head>
,您将找到标题,描述以及文章的图像链接。