【问题标题】:Jsoup parser not working as expected for particular URL onlyJsoup 解析器仅对特定 URL 无法按预期工作
【发布时间】:2017-05-04 04:23:59
【问题描述】:

我正在使用 Jsoup 下载页面内容,然后进行解析。

public static void main(String[] args) throws IOException {
        Document document = Jsoup.connect("http://www.toysrus.ch/product/index.jsp?productId=89689681").get();
        final Elements elements = document.select("dt:contains(" + "EAN/ISBN:" + ")");
        System.out.println(elements.size());
    }

问题:如果你查看页面内容的来源,有标签存在<dt>,其中包含EAN/ISBN:文本,但是如果你运行上面的代码,它会给你0在输出中,虽然它应该给我1。我已经使用document.html()检查了html,似乎有html标签,但我想要的标签被<dt>之类的字符替换,而不是<dt>。相同的代码适用于同一站点的其他产品网址。

我已经使用过 Jsoup 并开发了许多解析器,但我不明白为什么上面非常简单的代码不起作用。真奇怪!是 Jsoup 的错误吗?有人可以帮帮我吗?

【问题讨论】:

    标签: java html parsing jsoup


    【解决方案1】:

    当使用 connect() 或 parse() 时,jsoup 将默认期望一个有效的 html 并在需要时自动格式化输入。您可以尝试使用 xml 解析器。

        public static void main(String [] args) throws IOException { 
            String url = "http://www.toysrus.ch/product/index.jsp?productId=89689681";
            Document document = Jsoup.parse(new URL(url).openStream(), "UTF-8", "", Parser.xmlParser());
            //final Elements elements = document.select("dt:contains(" + "EAN/ISBN:" + ")");
            // the same as above but more readable:
            final Elements elements = document.getElementsMatchingOwnText("EAN/ISBN");            
            System.out.println(elements.size());
        }
    

    【讨论】:

    • 使用xmlParser有什么缺点吗?
    • 通过使用connect().get() 或 parse(),你隐含地告诉 jsoup 使用它的 htmlParser()。此解析器将输入视为 HTML5,并根据传入标签的语义知识强制创建规范化文档。解析时会应用HTML5解析规则(例如有标签的白名单;未关闭的标签将自动关闭; bla 将转换为 bla 等等)
    • xmlParser() 假定不知道传入的标签,也不将其视为 HTML,而是直接从输入创建一个简单的树。使用此解析器,您可以按原样解析输入,而无需应用 HTML5 解析规则。我没有看到任何缺点。如果有一些我不能告诉。
    • 我认为connect 也应该与Jsoup.connect(url).parser(Parser.xmlParser()) 一起使用
    【解决方案2】:

    您需要在 'EAN/ISBN:' 值周围加上单引号;否则将被解释为变量。

    此外,没有必要分解字符串并将片段连接在一起。只需将整个内容放在一个字符串中即可。

    【讨论】:

    • 请自己试一试再回答,您的任何建议根本不相关。感谢您的宝贵时间。
    猜你喜欢
    • 2023-03-17
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    相关资源
    最近更新 更多