【问题标题】:JSoup web-scraping: How to select each valueJSoup web-scraping:如何选择每个值
【发布时间】:2018-09-29 14:52:51
【问题描述】:

我目前正在尝试使用 Jsoup 从 website 获取一些值,用于我的 android 应用程序。

基本上,我想提取这些值: 所以在代码中,模型名称应该转到 gpuModel 变量,价格转到 gpuPrice 等等,对于每一个图形卡。然后我会使用以下代码将它们存储在 firebase 中:

public void addToDatabase(String model, int price, int rating, double value, 
double bench) {
        Map<String, Object> docData = new HashMap<>();
        docData.put("model", model);
        docData.put("rating", rating);
        docData.put("bench", bench);
        docData.put("value", value);
        docData.put("price", price);

        db.collection("gpu").document(model).set(docData);
    }

这是每个 GPU 的 HTML 代码:

我目前正在尝试仅提取 gpu 型号名称以使其简单(最后我也想提取所有其他值),这是我当前的网络抓取代码:

public void webScrape(){
    new Thread(new Runnable() {
        @Override
        public void run() {
            final StringBuilder builder = new StringBuilder();

            try {
                Document doc = Jsoup.connect("https://www.videocardbenchmark.net/GPU_mega_page.html").get();
                Elements gpus = doc.select("[id^=gpu]");

                for (Element i : gpus) {
                    Elements gpuModel = i.select("tr td:nth-child(2)");
                    String gpuName = gpuModel.text().replace("/", "");
                    addToDatabase(gpuName, 12,12,12,12);
                }
            } catch (IOException e){
                e.printStackTrace();
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {

                }
            });
        }
    }).start();

按照我的逻辑,这应该选择所有 GPU,然后在 for 循环中,它只会提取卡的名称。将 gpuName 设置为提取的任何内容并将其推送到数据库。

但是,我在我的数据库中得到了这个:

它提取了 GPU 名称,还提取了所有其他不需要的字段(包括价格、价值、测试日期等)。

所以我的问题是,如何分别选择每个值?我在互联网上找到的所有示例都是通过一个非常简单的网站完成的,其中每个值都有自己的 ID,所以我无法真正向他们学习。

如果有什么我应该提供的,请告诉我。

我想要的简单代码表示:

Document doc = Jsoup.connect(the url).get();
Elements gpus = doc.select(all gpu);

for (each gpu in all gpus) {
      gpuName = gpu.select(name);
      gpuPrice = gpu.select(price);
      gpuValue = gpu.select(value);
      gpuPower = gpu.select(power);
      addToDatabase(gpuName, gpuPrice, gpuPower, gpuValue);
   }

【问题讨论】:

    标签: android html css-selectors jsoup


    【解决方案1】:

    您应该在 run 方法中使用 a:nth-child(2) 作为模型名称选择器:

    Elements gpuModel = i.select("a:nth-child(2)");
    

    【讨论】:

    • 哇,它的工作原理!谢谢你,但我不得不问,你如何提取其他值?我似乎无法理解 css 选择器,因为 HTML 文档有很多变体。有什么好的建议吗?
    • 例如,tr td:nth-child(2) 怎么会提取所有其他值?我以为我无法理解逻辑
    • 这是我的猜测,td:nth-child(8) 会提取测试日期吗? (在我的例子中,2016 年 8 月)
    • 您对考试日期的看法是正确的。找出正确选择器的最佳方法是使用浏览器的开发人员工具 (F12) 并使用“检查”功能选择一个元素并查看它的选择器。
    • 不客气 :) 我来这里是为了帮助其他人,就像我从这个网站获得帮助一样,所以不需要其他任何东西 - 尽情享受吧!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2018-11-16
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2016-03-14
    • 2021-09-03
    相关资源
    最近更新 更多