簡體   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