2017-01-02 48 views
0

我最近試圖與JSoup一起解析HTML文檔,我經歷了JSoup的過程,發現select-Method可能是我正在尋找的東西。JSoup選擇標籤遞歸搜索

我試圖完成的是在一個html文檔中查找具有某個類的所有元素。爲了測試這一點,我嘗試了這個與亞馬遜網頁(想法:找到所有優惠)。

因此,我檢查了網頁,看看哪些類和ID正在使用,然後我試圖將其整合到一個小的代碼片段。在這個例子中我發現follwing元件:

<span id="dealTitle" class="a-size-base a-color-link dealTitleTwoLine restVisible singleCellTitle autoHeight">PROCAVE Matratzen-Brücke aus Schaumstoff 25 x 200 cm für ...</span> 

此元件被嵌入在其它元件和存在多次(當然每個交易)。所以這裏是我的代碼閱讀交易元素:

Document doc = Jsoup.connect("https://www.amazon.de/gp/angebote/ref=gbph_ftr_s-8_cd61_page_1?gb_f_LD=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL%252CUPCOMING,dealTypes:LIGHTNING_DEAL,page:1,sortOrder:BY_SCORE,dealsPerPage:8&pf_rd_p=425ddcb8-bed4-4e85-ac0f-c1a79d14cd61&pf_rd_s=slot-8&pf_rd_t=701&pf_rd_i=gb_main&pf_rd_m=A3JWKAKR8XB7XF&pf_rd_r=BTHRY008J9N3N5CCMNEN&gb_f_second=dealStates:AVAILABLE%252CWAITLIST%252CWAITLISTFULL,dealTypes:COUPON_DEAL,page:8,sortOrder:BY_SCORE,dealsPerPage:8").timeout(0).get(); 

      Elements deals = doc.select("span.a-size-base.a-color-link.dealTitleTwoLine.restVisible.singleCellTitle.autoHeight"); 

      for (Element deal : deals) { 
       if (deal.text().contains("ItemMatch")) { 
        System.out.println("Found deal: " + deal.text()); 
       } 
      } 

不幸的是,我不能得到我期待的元素。 交易總是大小爲0.我試圖修改我的選擇只有一部分類,我添加了id屬性等。不過,我沒有得到這些元素(在這種情況下,這些元素嵌套到其他元素中)。如果我嘗試在DOM層次結構中位於此元素之上的元素(例如,具有類「a-section a-spacing-none slotContainer」的div),則可以找到該元素。

我是不是真的需要指定整個DOM的層次結構(在我的選擇表達式中使用「>」?我希望能夠定義一個選擇器和JSoup會斯格特和搜索整個DOM樹。

+0

如果您的問題得到了充分解答,您應該考慮接受最佳答案,從而將此問題標記爲已解決。如果您需要進一步的幫助,請詳細說明您需要幫助的內容。 – luksch

回答

0

不,你不必指定完整的DOM層次結構,如果元素真的是DOM的一部分,你的測試應該可以工作,我懷疑它們可能不是DOM的一部分,因爲它被加載爲JSoup,原因可能是我,內部DOM節點是通過AJAX通過JavaScript填充的,JSoup不運行JavaScript,所以動態加載的DOM部分是不可訪問的。爲了實現你想要的,你可以直接查看AJAX調用並分析它們,或者移動到另一個像selenium webdriver這樣的解決方案,該解決方案運行真正的瀏覽器,其中包括一項工作JavaScript引擎。

+0

是的,你是對的,這是因爲JS/AJAX。感謝將我重定向到硒webdriver,我會嘗試。 –