【问题标题】:Jsoup selectors returning all values instead of searched valuesJsoup 选择器返回所有值而不是搜索值
【发布时间】:2016-02-21 13:52:07
【问题描述】:

我正在学习如何使用 jsoup,并且我创建了一个名为 search 的方法,它使用 jsoup 的选择器 containscontainsOwn 来搜索给定项目并返回它的价格。 (现在项目名称是硬编码的,用于测试目的,但该方法稍后将接受一个参数来接受任何项目名称)。

我遇到的问题是选择器不起作用,页面上的所有价格都被返回,而不是被搜索的一个项目,在这种情况下是“百叶窗”。因此,在此示例中,如果您点击链接,该页面上只有一件商品显示百叶窗,并且价格列为“$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;
}

【问题讨论】:

    标签: java css-selectors jsoup


    【解决方案1】:

    如果您至少尝试过调试您的应用程序,那么您肯定会发现自己的错误在哪里。 例如在这一行放置断点:

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

    然后你会看到,这个循环中的元素确实包含了盲文。 (以及所有被选中的)

    我不知道为什么要制作超级通用的工具,它将在任何地方都可以使用 - IMO 是不可能的,并且您必须为每个页面制作自己的爬虫。在这种情况下,您的代码可能应该是这样的(我必须添加超时 + 此代码在我这边无法完全运行,因为我有默认货币 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;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-27
      • 2023-04-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多