Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xpath解析无法正确解析_Java_Xpath_Html Parsing_Htmlcleaner - Fatal编程技术网

Java xpath解析无法正确解析

Java 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();

我编写了一个使用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;
    }
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来处理这种情况。