2014-12-04 58 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

相关问题