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