WebHU - Programozási kérdések és válaszok

JSoup web-kaparás: Hogyan válasszuk ki az egyes értékeket

Jelenleg próbálok néhány értéket lekérni egy webhelyről a Jsoup segítségével az Android-alkalmazásomhoz.

Alapvetően ezeket az értékeket akartam kinyerni:adja meg itt a képleírást, így a kódban a modellnévnek a gpuModel változónak kell lennie, az áraknak a gpuPrice-nek kell lennie, és így tovább minden egyes grafikus kártyánál. majd tárolnám őket a Firebase-ben a következő kóddal:

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

Ez az egyes GPU-k HTML-kódja:adja meg itt a kép leírását

Jelenleg csak a gpu modell nevét próbálom kibontani, hogy az egyszerű legyen (a végén az összes többi értéket is ki akarom bontani), ez a jelenlegi webkaparó kódom:

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

Az én logikám szerint ennek ki kell választania az összes GPU-t, majd a for ciklusban csak a kártya nevét fogja kivonni. állítsa be a gpuName-et a kicsomagolt értékre, és tolja el az adatbázisba.

De ehelyett ezt kaptam az adatbázisomban:

firebase

Kibontotta a GPU nevét, de az összes többi nem kívánt mezőt is (beleértve az árakat, az értéket, a teszt dátumát stb.).

szóval a kérdésem az, hogy hogyan tudok minden értéket külön-külön kiválasztani? az összes példa, amit az interneten találtam, egy nagyon egyszerű weboldalon készült, ahol minden értéknek saját azonosítója van, így nem igazán tudok tanulni belőlük.

Ha bármit meg kell adnom, kérem, szóljon.

egyszerű kód megjelenítése annak, amit akarok:

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

Válaszok:


1

Használja a a:nth-child(2)-t modellnév-választóként a run metóduson belül:

Elements gpuModel = i.select("a:nth-child(2)");
29.09.2018
  • oh wow működik! köszönöm, de meg kell kérdeznem, hogy a többi értéket hogyan lehet kivonni? Úgy tűnik, nem értem a css választót, mivel a HTML dokumentumoknak nagyon sok változata létezik. valami jó tipp? 29.09.2018
  • például, hogy lehet, hogy a tr td:nth-child(2) kivonja az összes többi értéket? azt hittem, nem fogom a fejemet a logika köré csavarni 29.09.2018
  • ez az én tippem, td:nth-child(8) kivonja a teszt dátumát? (az én példámban 2016. aug.) 29.09.2018
  • Igazad van a teszt dátumával kapcsolatban. A megfelelő választó kiválasztásának legjobb módja a böngésző fejlesztői eszközeinek (F12) használata, és az „ellenőrzés” funkció használatával kiválasztani egy elemet, és megnézni a választót. 30.09.2018
  • ó fiú, nem is tudtam, hogy létezik, köszönöm szépen!!! ja és még egy dolog, ha nem bánod, mivel a gpu modell neve az első td-n belül található (td:nth-child(1)), miért engedheti meg magának a kódja, hogy ne válassza ki az első td-t, és mégis megkapja a modell neve? 30.09.2018
  • a html az egyes azonosítókon belüli összes a-t egészként kezeli? Ez azt jelenti, hogy ha beírom a:nth-child(3), akkor felülről kivonja a harmadik a-t, függetlenül attól, hogy melyik td-n található? 30.09.2018
  • Érdekes kérdések ezek. Talán valóban a válasz a a címke miatt van. 30.09.2018
  • teszteltem, és igen, ha nem említem a td-t, az rendben van, egyszerűen a:nth-child(3)-al tudom kivonni az árat, de valamiért nem minden gpu-n, ezért maradok a szokásos módszernél (először a td-t említve). Mindenesetre nagyon köszönöm a segítségedet, nagyon sokat segítettél ebben, különösen az általad említett nézetválasztó eszközben. bármit tehetek érted? esetleg megosztod a dolgaidat vagy ilyesmi? 30.09.2018
  • Szívesen:) Azért vagyok itt, hogy segítsek másoknak, ugyanúgy, ahogy erről az oldalról kapok segítséget, szóval semmi másra nincs szükség – élvezd! 30.09.2018
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..