解析html文档中的href并通过xpath进行评估返回空指针异常

时间:2014-08-23 10:11:42

标签: java html parsing xpath

我要在一个网站的特定位置解析网址。为此我用Java编写了一个简单的程序。但是这个程序返回空指针异常。似乎getNameItem("href")返回null。我怀疑使用getNameItem提取内部网址的错误方法" href"标签

DocumentBuilder b = DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = b.parse(new FileInputStream("clean.html"));

//Evaluate XPath against Document itself
javax.xml.xpath.XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList)xPath.evaluate(".//*[@class='r_news_box']",
        doc.getDocumentElement(), XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); ++i) {
    Element e = (Element) nodes.item(i);
    System.out.println(e.getAttributes().getNamedItem("href").getTextContent());
}

P.S:这是应该由此xpath选择的节点之一:

<div class="r_news_box">
<a class="picLink" target="_blank" href="/fa/news/427583/test">
<img class="r_news_img" width="50" height="65" src="/files/fa/news/1393/5/29/411217_553.jpg" alt="test"/>
</a>

2 个答案:

答案 0 :(得分:1)

可能是因为并非所有选定的节点都具有href属性。您可能希望更改XPath以确保仅返回具有href属性的元素:

.//*[@class='r_news_box' and @href]

更新:

根据您的更新,href<a>属性等于class的元素中的r_news_box节点的属性,因此这里更正了XPath:

.//*[@class='r_news_box']/a[@href]

答案 1 :(得分:0)

使用XML Parser Librarys编写html解析器不是一个好主意。大多数html网站都不是有效的xml文档。您可以更好地使用像jsoup这样的html解析器。它非常易于使用和自我解释。这是一个example