Java xpath解析无法正确解析

时间:2014-08-17 09:38:37

标签: java xpath html-parsing htmlcleaner

我写了一个用于使用xpath解析html页面的小代码。我的问题是这个代码适用于某些页面而不适用于其他页面。你能指导我可能造成这样的问题吗?我做了一些调试,我的第一个猜测是我没有正确使用Html清理器。

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模式中提取文本并简单地打印它。但是在必需的例子中不起作用。

解决方案:我发现在浏览器中编译html页面后,我可以更改由于使用绝对xpath而且可能是xpath这个时间引起的问题。通过使用相对xpath解决了主要问题,但我无法使用相对xpath到达html的某些部分,我需要使用绝对值。所以我的问题是如何在我的java代码中使用html的编译版本?

1 个答案:

答案 0 :(得分:0)

如果您的XPath不起作用,则意味着无法在文档中找到您的选择器。当你在浏览器中查看文章时,有时事情并不像看起来那样。请记住,当您在浏览器中查看它时,JavaScript正在被执行,并且很多时候意味着重新排列或向DOM添加元素。

您的XPath查询有点具体,您可能会有更好的运气使它更轻松,所以如果缺少一个<div>标签,它就不会破坏整个事情。特别是在HTML中使用xpath时,您应该更多地依赖idclass属性。我认为您尝试获取直接位于ID为mediaarticlehead的元素下的页面标题。

使用此xpath //*[@id="mediaarticlehead"]/div/h1

然而,当W3C已经使用<meta>标签解决了这个问题时,所有这些都可以获得文章标题。查看文档的<head>,您会找到标题,说明以及可能是文章图片的链接。