2015-06-28 79 views
1

我想刮一個網頁,但由於某種原因,它似乎只能橫向到頁面上的某個點。我打印了整個文檔以確保我需要的元素在那裏(我知道有時候某些代碼是因爲JavaScript等原因而未捕獲的)。在將html代碼輸出到文本文件後,我能夠驗證我需要的數據是否被JSoup成功捕獲。JSoup沒有橫跨整個HTML頁面

我試着增加超時和maxbody大小,以確保它不限於那裏。

任何人都可以指出我錯過了什麼嗎?

doc = Jsoup.connect("https://www.mississaugahardware.com/products?keyword=dcf680n1&mainc=") 
      .header("Accept-Encoding", "gzip, deflate") 
      .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0") 
      .maxBodySize(0) 
      .timeout(600000) 
      .get(); 


    Elements info = doc.select("span[class=PriceListModeBig"); 

我能拉值附近的頁面頂部元素,但不會進一步下跌。

+0

你的選擇是錯誤的...當你使用類(你可以使用你正在做的方式,但它不是常見的方式)你必須使用這個'span.PriceListModeBig'。除此之外,你沒有關閉支架。 –

+0

我試圖抓取你的代碼示例中的網站,我固定了選擇器,但仍然沒有任何東西。所以我猜測網站正在異步加載產品。如果是這種情況,您將無法使用jsoup抓取它。 –

+0

@EricMartinez我有同樣的結果。當我將doc的整個值發送到輸出文件時,我能夠看到類和其中的值。這不意味着它正在加載它嗎? – user818502

回答

2

您的請求返回包含此僞HTML在線文檔:

<td><span class=&quot;PriceListModeBig&quot;>$99.00 CAD <span class=&quot;productitalic&quot;></span></td> 

注意&quot;在就行了!

這是因爲您嘗試解析的HTML實際上是輸入元素的值標記,其ID爲dnn_ctr306650_ViewLayoutManager_SCESideMenu_2_hSearchResult。我不確定該ID是否與請求的變化保持一致。在我測試時,它似乎很穩定,但它也可能取決於請求的輸入參數。我沒有調查這一點。

Jsoup似乎沒有太好的解釋。當然很奇怪,web服務器返回這樣的東西,但它是。我通過獲取輸入的值和Jsoup再次解析結果解決了這個:

doc = Jsoup.connect("https://www.mississaugahardware.com/products?keyword=dcf680n1&mainc=") 
       .header("Accept-Encoding", "gzip, deflate") 
       .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0") 
       .maxBodySize(0) 
       .timeout(600000).get(); 

Element el = doc.select("#dnn_ctr306650_ViewLayoutManager_SCESideMenu_2_hSearchResult").first(); 
String innerHtml = el.attr("value");   
Document docInner = Jsoup.parse(innerHtml); 

Elements info = docInner.select("span.PriceListModeBig");