使用jsoup从网站获取所需信息

时间:2014-05-22 14:19:06

标签: java jsoup web-crawler

我最近阅读了一篇由example发布的使用jsoup的BalusC

他的代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class test{

    public static void main(String[] args) throws Exception {
        String url = "https://stackoverflow.com/questions/2835505";
        Document document = Jsoup.connect(url).get();

        String question = document.select("#question .post-text").text();
        System.out.println("Question: " + question);

        Elements answerers = document.select("#answers .user-details a");
        for (Element answerer : answerers) {
            System.out.println("Answerer: " + answerer.text());
        }
    }
}

代码就像一个魅力,看起来非常简单,但我不知道如何修改它,以便从here获得最便宜的轮胎价格。我该怎么做?

2 个答案:

答案 0 :(得分:2)

尝试:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class test{

    public static void main(String[] args) throws Exception {
        String url = "http://www.mimovrste.com/letne-avtomobilske-pnevmatike?p-min=31.65&p-max=348.35&o=_price";
        Document document = Jsoup.connect(url).get();

        Elements prices = document.select(".lst-product-item-price");
        for (Element price : prices) {
            System.out.println("Price: " + price.text());
        }
    }
}

答案 1 :(得分:1)

我想这个问题还有更多。 Pisek的逻辑是正确的,类lst-product-item-price给出了所有价格的列表,但它只给出了一页中的列表。在这种情况下,我们有27页。它也有不同的排序顺序。因此,您可能需要浏览所有页面,然后找到最便宜的页面。

但是,我想知道为什么我们需要在这里解析html?相关网址为http://www.mimovrste.com/letne-avtomobilske-pnevmatike?p-min=31.65&p-max=348.35&o=_price。这本身就是最低价和最高价。因此,可以立即从URL字符串中解析结果。

假设您需要未过滤列表的结果,那么您需要在没有任何最小或最大限制的情况下找到最便宜的结果。假设您只想输入http://www.mimovrste.com/letne-avtomobilske-pnevmatike来获得限制,那么实现此目的有两个技巧。

首先(最简单)

注意右侧的菜单,上面写着" Cena"意思"价格"。该字段默认为最小值和最大值。即使您使用以前的网址,这也适用。如果您检查html,则显示该值存储在隐藏字段和名称为" p-min"的文本字段中。因此,选择名称属性为name="p-min"的输入,这是您最便宜的值。这种方法的优点是它提供了一个直接的十进制值,并且转换为double是直接的。

cheapest = doc.select("input[name=p-min]").first().attr("value");

<强>第二

注意网址。排序顺序以&#39; o命名。因此,如果您在网址中说o=price,则会根据价格按升序对列表进行排序,如果您将其设为o=_price,则会按价格降序排列。所以传入一个参数&#34; o&#34;有价值的&#34; _price&#34;正如Pisek所说,选择第一个lst-product-item-price的值会给你最便宜的价值。这将给出一个带逗号和€符号的String值。

doc = Jsoup.connect(URL).data("0", "_price").get();
cheapest = doc.select("b.lst-product-item-price").first().text();

全部放在一起

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;


public class TyrePrice {

    public static void main(String[] args) {
        try {
            String URL = "http://www.mimovrste.com/letne-avtomobilske-pnevmatike";
            Document doc = Jsoup.connect(URL).get();

            // Approach 1
            String cheapest = doc.select("input[name=p-min]").first().attr("value");
            System.out.println(cheapest); // Prints 31.65

            // Approach 2
            doc = Jsoup.connect(URL).data("0", "_price").get();
            cheapest = doc.select("b.lst-product-item-price").first().text();
            System.out.println(cheapest); // Prints 31,65 €

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

希望这会有所帮助。 :)