JSoup 网络抓取:如何 select 每个值

JSoup web-scraping: How to select each value

我目前正在尝试使用 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();

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

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

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

所以我的问题是,我如何 select 每个值分别?我在互联网上找到的所有示例都是在一个非常简单的网站上完成的,其中每个值都有自己的 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);
   }

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

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