繁体   English   中英

Jsoup select未获取所有元素

[英]Jsoup select is not fetching all elements

请参见下图。 红色箭头前的元素已加载,但红色箭头后的元素出于某种原因未加载。

在此处输入图片说明

我选择这些元素的方式是

doc = Jsoup.connect(url).header("Accept-Encoding", "gzip, deflate").userAgent("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36").maxBodySize(0).timeout(600000).get();

Elements detailsBuyBoxContainer = doc.select("li[class^=product-tile]");
System.out.println(detailsBuyBoxContainer.size());

也尝试使用下面的选择

/*Elements detailsBuyBoxContainer = doc.getElementsByAttributeValueContaining("class",
"details-buy-box-container");*/

打印的尺寸应为24,而不是20

该列表由客户端JavaScript(即AJAX调用)部分填充。 JSoup不运行Javascript,也不是浏览器,因此您尝试的幼稚方法无法正常工作。

我看到两种解决方案:

A)使用Selenium Webdriver,这是一个真正的浏览器,可以很好地加载AJAX东西。

B)识别自己的AJAX调用并使用JSoup直接调用Api URL。 尽管您可能不得不使用不同的抓取技术,例如解释JSON而不是HTML,但通常对此并不难理解。

附录

我对tesco网站进行了更多研究,似乎他们使用一种有点有趣的方法来发送包含HTML的JSON响应。 我想这可以节省一些客户端上的JavaScript工作,但这仍然有些奇怪。 那好吧。 这是我使用浏览器网络标签捕获的呼叫。 向下滚动列表时,将对http://www.tesco.com/direct/blocks/catalog/productlisting/infiniteBrowse.jsp?&view=grid&catId=4294967294+4294814304&sortBy=&searchquery=espresso+machine&offset=20&lazyload=true进行Ajax调用http://www.tesco.com/direct/blocks/catalog/productlisting/infiniteBrowse.jsp?&view=grid&catId=4294967294+4294814304&sortBy=&searchquery=espresso+machine&offset=20&lazyload=true

似乎offset参数是您需要增加以获得更多结果的参数。 此类调用的内容是一个JSON对象,其中包含两个属性:“产品”和“变体”。 products属性似乎包含html。

所以一步一步来:

1)使用Jsoup(或例如Apache HttpClient)获取Ajax调用的原始内容:

Connection con = Jsoup.connect("http://www.tesco.com/direct/blocks/catalog/productlisting/infiniteBrowse.jsp?&view=grid&catId=4294967294+4294814304&sortBy=&searchquery=espresso+machine&offset=20&lazyload=true")
            .ignoreContentType(true);    
Response res = con.execute();
String rawJSON = res.body();

2)根据您的喜好使用库解析JSON。 我通常使用Json-Simple

JSONObject o = (JSONObject) JSONValue.parse(html);
String html = (String) o.get("products");

请注意,JSON-Simple易于使用,但不使用泛型。 您可能还想研究Jackson的Gson。

3)用JSoup解析html:

Document doc = Jsoup.parse(html);

检查该网站的代码,并找到生成缺少的元素的ajax函数,然后必须将该函数的调用放在Jsoup.connect函数中!

这可以帮助您!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM