JSoup 不会从脚本标记中检索 JSON 数据



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

每当我尝试打印内容时,我都会得到一个空字符串。我尝试使用不同的方法获取数据:选择IDdoc.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);
}

将脚本元素视为数据:

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

请注意,如果您可以在环境中使用调试器,则会显示该元素一直具有结果,但作为类型为DataNodeelementchildNode,这是第一条线索。

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

对于这种情况,您可能想要尝试另一种API,例如Selenium。

J汤的text((返回在浏览器中呈现的文本。"script"标记根本不会呈现(除非您使用CSS技巧!(,所以它返回一个空字符串。至少我认为Jsoup的开发人员是这么想的。

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

最新更新