【问题标题】:JSoup doesn't retrieve JSON data from script tagJSoup 不会从脚本标签中检索 JSON 数据
【发布时间】:2021-08-02 08:10:45
【问题描述】:

我正在尝试使用 JSoup (1.13.1) 从 HTML 页面中的配方中获取脚本标记(JSON 数据)中的内容。我不会发布 HTML 代码,但脚本标签内容很大。

每当我尝试打印内容时,都会得到一个空字符串。我尝试使用不同的方法获取我的数据:选择 ID doc.select("#__NEXT_DATA__"),或使用 doc.select("script[type='application/json']")

如果我尝试遍历所有脚本标签,只要它到达我想要的脚本标签,它就会打印空白。 我还尝试使用text() 方法和toString() 方法打印内容,但它不起作用。我什至看到有人说你可以设置maxBodySize(0),但它仍然不起作用。

这是我的代码:

String url = "https://www.marmiton.org/recettes/recette_gateau-au-chocolat-fondant-rapide_166352.aspx";
doc = Jsoup.connect(url).maxBodySize(0).get();

Elements newsHeadlines = doc.select("#__NEXT_DATA__");
                    
for (Element element : newsHeadlines) {
    System.out.println(element);
}

【问题讨论】:

    标签: java json parsing jsoup


    【解决方案1】:

    Jsoup 实际上并不解析脚本标签。当它抓取网站时,它会在任何 Javascript 脚本发挥作用之前获取网站的 HTML 源代码。因此,当您尝试获取脚本时,它无法识别脚本标签。

    对于这种情况,您可能需要尝试其他 API,例如 Selenium

    【讨论】:

      【解决方案2】:

      Jsoup 的 text() 返回在浏览器中呈现的文本,有点像。 'script' 标签根本不会渲染(除非你使用 CSS 技巧!),所以它返回一个空字符串。至少我认为 Jsoup 的开发者是这么想的。

      相反,您可以使用 html() 方法,它返回某种“原始”文本,IOW 脚本元素内的文本。

      【讨论】:

        【解决方案3】:

        将脚本元素视为数据:

        Elements newsHeadlines = doc.select("#__NEXT_DATA__");
        
        for (Element element : newsHeadlines) {
            System.out.println(element.data());
        }
        

        请注意,某些控制台可能会在显示一行长度为 81206 个字符时出现问题(eclipse 为我做了)(或数据中有某些内容),因此此代码仅打印出开头...

            for (Element element : newsHeadlines) {
                System.out.println(element.data().length());
                
                int printLen = Math.min(100, element.data().length());
                System.out.println(element.data().substring(0,printLen));
            }
        

        并产生:

        81206
        {"props":{"pageProps":{"recipeData":{"recipe":{"id":166352,"guid":"7bf48b95-4cd2-4b32-8f41-fb6168510
        

        请注意,如果您可以在您的环境中使用调试器,它将显示该元素一直都有结果,但作为elementelement 类型的DataNode 这是第一个线索。

        【讨论】:

        • 感谢您的回复。我尝试了您的解决方案,但我没有遍历 for 循环,只是得到了 first() 元素。几个小时前它工作得很好,但现在根本不工作。我检查了网站,显然包含数据的脚本标签消失了。你知道有什么原因吗?
        • 我现在也注意到虽然__NEXT_DATA__ 脚本标签仍然存在,但它的数据是{} (length=2)。这个脚本标签显然是由他们的 React Js 实现产生的,不是 Jsoup 问题,而是他们的 React Js 实现之一。奇怪的是,在使用 Chrome 浏览器(但不是全部)的一些尝试中,我仍然可以看到完全填充的标签。
        猜你喜欢
        • 2021-09-15
        • 2011-07-06
        • 2019-07-17
        • 2018-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 1970-01-01
        相关资源
        最近更新 更多