2014-12-04 57 views
0

的我正在學習如何使用jsoup,我已經創建了一個名爲search方法,它使用jsoup的選擇containscontainsOwn搜索一個給定的項目,回到它的價格。 (現在,項目名稱爲了測試目的而被硬編碼,但該方法稍後將接受參數以接受任何項目名稱)。Jsoup選擇返回所有值,而不是搜索值

我遇到的問題是選擇器不工作,並且頁面上的所有價格都將被返回,而不是正在搜索的一個項目,在這種情況下是「百葉窗」。因此,在此示例中,如果您按照鏈接進行操作,則該頁面上只有一個項目表示百葉窗,價格列爲「$ 30 - $ 110原價$ 18 - $ 66銷售額」,但該頁面上的每個項目都會返回。

我知道,使用jsoup我可以明確地調用div的名稱,並從中提取信息。但我想把它變成一個更大的項目,並從沃爾瑪,西爾斯,梅西等其他連鎖店提取同一物品的價格。不僅僅是我在我的代碼中使用的特定網站。因此,如果我想這樣做,我不能明確地調用div名稱,因爲這隻能解決一個站點的問題,而不能解決其他站點的問題,並且我想採取一種方法來同時包含大多數這些站點。

如何提取與其合適項目相關的價格?有沒有辦法做到這一點,以便項目和價格提取將適用於大多數網站?

我將不勝感激任何幫助。

private static String search(){ 
    Document doc; 
    String priceText = null; 

    try{ 
     doc = Jsoup.connect("http://www.jcpenney.com/for-the-home/sale/cat.jump?id=cat100590341&deptId=dept20000011").get(); 
     Elements divs = doc.select("div"); 
     HashMap items = new HashMap(); 
     for(Element element : doc.select("div:contains(blinds)")){ 

      //For those items that say "buy 1 get 1 free" 
      String buyOneText = divs.select(":containsOwn(buy 1)").text(); 
      Element all = divs.select(":containsOwn($)").first(); 
      priceText = element.select(":containsOwn($)").text(); 
      items.put(element, priceText); 
     } 
     System.out.println(priceText); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    return priceText; 
} 

回答

0

如果您已嘗試至少調試您的應用程序,那麼肯定會發現您的錯誤。 認沽斷點例如在這條線:

String buyOneText = divs.select(":containsOwn(buy 1)").text(); 

,然後你會看到,真正在這個循環元素包含百葉窗文本。 (和所有選擇的那樣)

我不知道爲什麼要製作超級通用工具,這將在任何地方工作 - 海事組織是不可能的,並且每個頁面都必須創建自己的抓取工具。在這種情況下,可能是你的代碼應該看起來像這樣(我要補充超時+這段代碼是不是在我身邊的工作充分,因爲我有默認貨幣PLN):

private static String search() { 
     Document doc; 
     String priceText = null; 
     try { 
      doc = Jsoup.connect("http://www.jcpenney.com/for-the-home/sale/cat.jump?id=cat100590341&deptId=dept20000011").timeout(10000).get(); 
      Elements divs = doc.select("div[class=price_description]"); 
      HashMap items = new HashMap(); 
      for (Element element : divs.select("div:contains(blinds)")) { 

       //For those items that say "buy 1 get 1 free" 
       String buyOneText = divs.select(":containsOwn(buy 1)").text(); 
       Element all = divs.select(":containsOwn($)").first(); 
       priceText = element.select(":containsOwn($)").text(); 
       items.put(element, priceText); 
      } 
      System.out.println(priceText); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return priceText; 
    } 
+0

謝謝您的幫助 – Rebecca 2014-12-08 19:28:21

相關問題