[英]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.