JSoup web-scraping: как выбрать каждое значение - PullRequest
0 голосов
/ 29 сентября 2018

В настоящее время я пытаюсь получить некоторые значения с веб-сайта с помощью Jsoup для моего приложения для Android.

По сути, я хотел извлечь эти значения: enter image description here так, чтобы в коде имя модели указывалось в переменной 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);
    }

Это HTML-код для каждого графического процессора: enter image description here

Я сейчас пытаюсьИзвлеките только имя модели 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 на то, что было извлечено, и отправьте его в базу данных.

Но вместо этого я получил это в своей базе данных:

firebase

Извлечено имя графического процессора, но также и все другие нежелательные поля(включая цены, стоимость, дату тестирования и т. д.).

поэтому мой вопрос: как выбрать каждое значение отдельно?Все примеры, которые я нашел в Интернете, были сделаны на очень простом веб-сайте, где у каждого значения есть свой собственный идентификатор, поэтому я не могу извлечь из них уроки.

Если есть что-то, что я должен предоставить, пожалуйста, скажите мне.

простое кодовое представление того, что я хочу:

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);
   }

1 Ответ

0 голосов
/ 29 сентября 2018

Вы должны использовать a:nth-child(2) в качестве селектора названия модели внутри вашего run метода:

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