2015-10-14 91 views
0

我試圖通過它的類來獲取特定的div。該類實際上包含多個用空格分隔的類,但是:最後一個類由空格分隔!獲得包含連續兩個空格的類的div(jsoup)

例:類=試驗[SPACE]測試[SPACE]測試[SPACE] [SPACE]測試

全:

listing[SPACE]category_templates[SPACE]clearfix[SPACE]shelfListing[SPACE][SPACE]multiSaveListing

現在我怎麼會去這樣做呢?

沒有工作(沒有錯誤拋出):

Elements divItemContainer = doc.select("div[class=listing category_templates clearfix shelfListing multiSaveListing]"); 
      for (Element div : divItemContainer) { 
       Toast.makeText(ApplicationContextProvider.getContext(), "Got Div: ", Toast.LENGTH_SHORT).show(); 
      } 

沒有工作(時拋出錯誤:字符串不能包含空格):

Elements divItemContainer = doc.select("div.listing.category_templates.clearfix.shelfListing..multiSaveListing"); 
      for (Element div : divItemContainer) { 
       Toast.makeText(ApplicationContextProvider.getContext(), "Got Div: ", Toast.LENGTH_SHORT).show(); 
      } 

沒有工作(沒有錯誤):

Elements divItemContainer = doc.select("div.listing.category_templates.clearfix.shelfListing.multiSaveListing"); 
      for (Element div : divItemContainer) { 
       Toast.makeText(ApplicationContextProvider.getContext(), "Got Div: ", Toast.LENGTH_SHORT).show(); 
      } 

PS:敬酒是爲了purposly崩潰的應用程序!它不只是殺死並應該發生的(至少在目前)

Source

<div class="listing category_templates clearfix shelfListing multiSaveListing"><div id="yousaveImage"></div><div class="multisave" id="multiSaveId"><a class="linksave" href="/promotion/2-for-250/ls85559"><span class="view-all">View all</span><span class="offer-2for3">2 for</span><span><span class="poundSign"></span><span class="ping-offer-finalValue">£2.50</span><span class="ping-offer-finalValue-1" style="display:none"></span><span class="pencep" style="display:none">p</span></span></a></div><div class="container"><div class="slider category_templates"><input id="itemId" value="1000000476716" type="hidden"><input id="maxQtyId" value="24.0" type="hidden"><div class="product active"><div class="slider"><div class="information active"><div class="imgContainer"><a href="/product/no-added-sugar/asda-chosen-by-you-orange-pineapple-double-strength-squash/1000000476716"><img class="" src="http://ui2.assets-asda.com:80/g/v5/501/375/5051413501375_130_IDShot_4.jpeg" data-original="http://ui2.assets-asda.com:80/g/v5/501/375/5051413501375_130_IDShot_4.jpeg" alt="ASDA Chosen By You Orange &amp; Pineapple Double Strength Squash 2 FOR £2.50" title="" onerror="loadNoImage(this)"></a><a href="#" id="addToShoppingList" class="shoppinglist-icon icon-addto" title="Add to shopping list" aria-haspopup="true" aria-expanded="false"><span class="accessible"> Add to shopping list</span></a></div><p class="bundle-contains" style="display:none;"> Contains <span>0</span>&nbsp;<span>items</span></p><p class="subTitle">1.5LT</p></div></div><div class="product-content"><span class="bundle-banner" style="display:none;"> Bundle </span><span class="promoBanner"></span><span class="primaryBanner" style="display:none;"><a href="/promotion/2-for-250/ls85559" title="2 FOR £2.50">2 FOR £2.50</a></span><span class="title" id="productTitle"><a role="presentation" aria-hidden="true" tabindex="-1" href="/product/no-added-sugar/asda-chosen-by-you-orange-pineapple-double-strength-squash/1000000476716" title="ASDA Chosen By You Orange &amp; Pineapple Double Strength Squash"><span>ASDA Chosen By You Orange &amp; Pineapple Double Strength Squash</span></a></span><div class="product-type-icons" style="visibility:visible"><i data-contentid="" data-similarproducts="true" data-title="Suitable for Vegetarians" data-name="Suitable for Vegetarians" title="Vegetarian" class="type-icon icon-suitable-for-vegetarians" data-infoiconid="1215398078196" data-id="2854136"><a href="#" class="icons">Vegetarian</a></i></div><div class="rating-static rating-50"><span class="star star1"></span><span class="star star2"></span><span class="star star3"></span><span class="star star4"></span><span class="star star5"></span></div><div class="prod-limit-Mask"></div><div class="quantity-info-Mask"><span class="qLimit-toolTip"></span><a href="#" class="undoLimit-close" role="alertdialog" aria-labelledby="quantityLimitText"> Close </a><div class="qLimit-popUp"><p id="quantityLimitText"><span class="qLimit-Sorry">Sorry...</span>You can't add more than <span class="max-qty-val">24</span> per order</p></div></div><div id="cartBground" class="addedbg"><div class="price-cart-block"><div class="price-wrap category_templates"><span class="price"><span>£1.40</span></span><span class="priceInformation"> (9.3p/100ml) </span></div><a href="#" onclick="return false;" class="btn btn-primary addItemToTrolley fav-test-item " data-skuid="1000000476716">Add</a><a href="/product/no-added-sugar/asda-chosen-by-you-orange-pineapple-double-strength-squash/1000000476716" class="view-bundle btn btn-primary fav-bundle-test-item" style="display:none;" data-skuid="1000000476716">View bundle</a><div class="quantityOptions clearfix"><a href="#" onclick="return false;" id="minusButtonId" onselectstart="return false;" aria-label="Quantity Decrease" class="btn btn-primary button-quantity quantityDecrease"><span>–</span></a><input aria-label="Quantity in your trolley" value="1" name="quantityInTrolley" class="prd-txt" maxlength="5" type="number"><a href="#" onclick="return false;" id="plusButtonId" onselectstart="return false;" aria-label="Quantity Increase" class="btn btn-primary button-quantity quantityIncrease"><span>+</span></a><a href="#" onclick="return false;" class="btn btn-primary add-small" style="display:none;" id="applyItemToTrolley">Add</a><div id="qtySelect" class="qty-wrapper" style="display: none;"><div class="qty-select"><span class="qty-value" tabindex="0" title="Quantity">Q<span class="accessible">uanti</span>ty</span><span class="qty-select-icon"></span></div><ul class="qty-list" style="display:none"><li class="qtyAccessible"><span title="Quantity" data-salesunit="Qty">Q<span class="accessible">uanti</span>ty</span></li><li class="kgAccessible"><span title="Kilogram" data-salesunit="kg">k<span class="accessible">ilo</span>g<span class="accessible">ram</span></span></li></ul></div><p id="inTrolleyId">in your trolley</p></div></div><div id="itemAjaxLoader" class="ajaxLoader 1000000476716" style="display:none;"><img src="//ui3.assets-asda.com/theme/img/common/loader.svg" style="width: 32px;" onerror="this.src=//ui3.assets-asda.com/theme/img/common/ajax-loader.gif; this.onerror=null;"></div><div class="unavail-item-message"> Item unavailable<span class="qLimit-toolTip"></span></div><div class="unavail-item"><span class="unavailable-image"></span><span></span></div></div></div><div class="sectionMenu"></div></div></div></div></div> 
+0

請添加具體的HTML代碼,包括相關標籤。 – TDG

+0

不確定,如果這實際上是允許的話。這是asda(any)的一個購物項目,可以 –

+0

確定,但將它作爲編輯添加到您的問題中,而不是作爲答案...您可以在問題標籤正下方找到EDIT按鈕。 – TDG

回答

1

這工作,但它是不安全的,沒有理由使用它。此外,爲了這個工作,你的類和空格的順序必須是相同的。你說它沒有,但我已經測試過,它確實如此。

Elements divItemContainer = doc.select("div[class=listing category_templates clearfix shelfListing multiSaveListing]"); 
for (Element div : divItemContainer) { 
    Toast.makeText(ApplicationContextProvider.getContext(), "Got Div: ", Toast.LENGTH_SHORT).show(); 
} 

這是這樣做的。類的順序並不重要,也不是空白。你說它不起作用,但我已經測試過了,它確實如此。

Elements divItemContainer = doc.select("div.listing.category_templates.clearfix.shelfListing.multiSaveListing"); 
for (Element div : divItemContainer) { 
    Toast.makeText(ApplicationContextProvider.getContext(), "Got Div: ", Toast.LENGTH_SHORT).show(); 
} 

對於這一個錯誤是正確的。

Elements divItemContainer = doc.select("div.listing.category_templates.clearfix.shelfListing..multiSaveListing"); 
for (Element div : divItemContainer) { 
    Toast.makeText(ApplicationContextProvider.getContext(), "Got Div: ", Toast.LENGTH_SHORT).show(); 
} 

您的查詢在執行前會經過驗證。發生的驗證將作爲您輸入的每個類的參數。您輸入的css選擇器會爲每個.分割,然後通過輸入連續的.來創建空類。

public static void notEmpty(String string) { 
    if ((string == null) || (string.length() == 0)) 
     throw new IllegalArgumentException("String must not be empty"); 
} 

它不工作的原因不是你的選擇器。嘗試輸入您從服務器獲得的回覆。當你不喜歡Document doc = Jsoup.parse()...嘗試打印doc。這是否包含您正在搜索的元素?我懷疑它沒有。

如果我是正確的,你要搜索的元素不存在於你所得到的響應,那麼你有兩種可能性。

  1. 服務器感知你的程序作爲一個bot而不允許或它提供你的手機頁面,所以它提供你通過瀏覽器瀏覽時,你所看到的東西。如果是這種情況,那麼解決方案是設置一個userAgent
  2. 該元素不存在,因爲它是由javascript生成的。 Jsoup只是一個解析器,而不是瀏覽器。它無法執行JavaScript,因此無法生成動態內容。爲了檢查您需要的內容是否是動態的,只需導航到該頁面並按Ctrl + U並檢查您需要的元素是否在那裏。這是任何JavaScript執行前的內容。
+0

非常感謝。你說的很對,頁面包含JavaScript(我之前沒有注意到) - 所以我看了一下Crawljax,但我無法理解它......有沒有可能爲我提供僞或真實的代碼示例? –

+0

不幸的是,我沒有使用過。此外,你正在使用Android更復雜的事情(我已經使用硒webdriver,但桌面)。你可以爲這個問題開闢一條新線索,因爲在完成你的研究之後,這是一個完全不同的主題。如果它解決了你的問題,不要忘記接受這個答案。 – alkis