【问题标题】:Java xpath parsing unable to parse correctlyJava xpath 解析无法正确解析
【发布时间】:2014-10-10 11:07:29
【问题描述】:

我编写了一个小代码,用于使用 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 模式中的文本并简单地打印出来。但在所需的示例中不起作用。

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

【问题讨论】:

  • 你能补充一些关于“不起作用”的细节吗?
  • 不提取与xpath模式相关的具体内容。我确信 xpath 模式是正确的。例如对于提到的示例 nodes.lenght()=0 所以它不会打印任何东西!
  • 好吧,如果您没有得到任何结果,显然您的 XPath 对您的数据不正确。您的 XPath 看起来非常像您使用某些 XPath 浏览器工具找到它并简单地复制它。当您的浏览器解析网页时,很可能是 Java 连接的结构不同。尝试更基本的 XPath 并显示它是否返回任何结果。
  • Xpath 是正确的。我使用 firefox firebug addon 来提取它们。我确实使用了其他工具,找到了相同的 xpath。我应该提到,相同的过程适用于某些网站。如果它是由于 xpath 它不应该适用于所有网站!
  • xpath 是正确的,但它是绝对 xpath,我发现我应该使用相对 xpath 来处理这种情况。

标签: java xpath html-parsing htmlcleaner


【解决方案1】:

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

您的 XPath 查询有点具体,您可能会更幸运,让它更轻松一些,因此如果缺少一个 &lt;div&gt; 标记,它不会破坏整个事情。特别是在 HTML 中使用 xpath 时,您应该更多地依赖 idclass 属性。我认为您试图获取 ID 为 mediaarticlehead 的元素正下方的页面标题。

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

然而,当 W3C 已经用&lt;meta&gt; 标签解决了这个问题时,这一切都是为了获得文章标题:)。查看文档的&lt;head&gt;,您会找到文章的标题、描述以及可能指向图片的链接。

【讨论】:

  • 很遗憾,所有页面都没有标题、图片等的元标记。
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2013-04-11
  • 2014-05-10
相关资源
最近更新 更多