IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Parsovanie HTML v Jave s knižnicou Jsoup - pokračovanie

Pokračovanie tutoriálu o knižnici Jsoup, ktorá sa používa pre načítanie, vyhľadávanie a manipuláciu s html dokumenty.

Odkazy a obrázky

public class Jsoup05 {
    private static String urlString = "http://pctforum.tyden.cz/viewtopic.php?f=22&t=2131&sid=e4961b3cd95117044f1ec079ecaf92c2";
    private static List<String> linkURLs = new ArrayList<>();
    private static List<String> imageURLs = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        Document doc = Jsoup.connect(urlString).get();

        // vyhledání elementů a s atributem href
        Elements links = doc.select("a[href]");
        for (Element link : links) {
            System.out.println(link.attr("href"));
            System.out.println(link.attr("abs:href"));
            System.out.println(link.absUrl("href"));
            System.out.println("================================");
            linkURLs.add(link.attr("abs:href"));
        }

        // vyhledání elementů img
        Elements images = doc.select("img");
        for (Element image : images) {
            System.out.println(image.attr("src"));
            System.out.println(image.attr("abs:src"));
            System.out.println(image.absUrl("src"));
            System.out.println("================================");
            imageURLs.add(image.attr("abs:src"));
        }

        System.out.println("Počet odkazů: " + linkURLs.size() + " | Výpis: " + Arrays.toString(linkURLs.toArray()));
        System.out.println("Počet obrázků: " + imageURLs.size() + " | Výpis: " + Arrays.toString(imageURLs.toArray()));
    }
}
Elements links = doc.select("a[href]");

Vyhľadanie všetkých elementov a, ktoré majú atribút href.

System.out.println(link.attr("href"));

Získanie a výpis relatívnej url.

System.out.println(link.attr("abs:href"));
System.out.println(link.absUrl("href"));

Získanie a výpis absolútnu url. Tu sú uvedené dva možné spôsoby a záleží na vás, ktorý si vyberiete. To isté platí aj pre elementy img, kde tiež najskôr získame a vypíšeme relatívnej url atribútu src a potom absolútnu url. Opäť sú uvedené oba spôsoby získania absolútnej url.

System.out.println("Počet odkazů: " + linkURLs.size() + " | Výpis: " + Arrays.toString(linkURLs.toArray()));
System.out.println("Počet obrázků: " + imageURLs.size() + " | Výpis: " + Arrays.toString(imageURLs.toArray()));

Na záver vypíšeme počet odkazov a obrázkov a ich absolútna url.

Atribúty

public class Jsoup06 {
    private static String urlString = "http://www.itnetwork.cz";

    public static void main(String[] args) throws IOException {
        Document doc = Jsoup.connect(urlString).get();

        Elements links = doc.select("a");
        for (Element link : links) {
            if (link.hasAttr("target")) {
                if (link.hasText()) {
                    System.out.println(link.text());    // text odkazu
                    System.out.println(link);           // celé html odkazu
                }
            }
        }

        Elements images = doc.select("img");
        for (Element image : images) {
            if (image.hasAttr("alt")) {
                if (image.attr("alt").length() > 2) {
                    System.out.println(image.attr("alt"));
                    System.out.println(image);
                }
            }
        }
    }
}

Tento kód načíta stránku na zadanom url, nájde všetky odkazy, ktoré majú atribút target a ak má daný odkaz nejaký text, vypíše text a následne celý odkaz. Potom vyhľadá všetky obrázky s atribútom alt a v prípade, že atribút alt má tri a viac znakov, vypíše hodnotu tohto atribútu a neskôr aj celý img element.

Prechádzanie diskusia

public class Jsoup07 {

    public static void main(String[] args) throws IOException {
        String urlString = "http://www.novinky.cz/diskuse?id=339381&articleId=/ekonomika/317675-zazracny-pristroj-na-usporu-elektriny-je-podvod-varuje-casopis-dtest.html&sectionId=5";
        Document doc = Jsoup.connect(urlString).get();

        String selectorContributions = "div#contributions";
        String selectorContribution = "div.contribution";
        //String selectorContribution = "div.msgBoxOut";

        Element contributions = doc.select(selectorContributions).first();
        //Element contributions = doc.getElementById("contributions");

        Elements selectedDivs = contributions.select(selectorContribution);
        // vypsání vybraných div
        for (Element div : selectedDivs) {
            System.out.println(div);
        }

        // vypsání textu vybraných div
        for (Element div : selectedDivs) {
            System.out.println(div.text());
        }

        // vyhledání elementů v rozsahu jiného elementu
        String selectorName = "h4.name";
        String selectorDate = "div.infoDate span";
        String selectorContent = "div.content";
        for (Element div : selectedDivs) {
            Element name = div.select(selectorName).first();
            Element date = div.select(selectorDate).first();
            Element content = div.select(selectorContent).first();
            System.out.println(name.text());
            System.out.println(date.text());
            System.out.println(content.text());
            System.out.println("=====================================");
        }
    }
}
Na načítané url sa nachádza diskusia. Ak sa pozriete do zdrojového kódu stránky, tak zistíte, že oblasť, v ktorej sa nachádzajú komentáre, má id contributions (<div id = "contributions"> oblasť s komentármi </ div>), každý komentár sa nachádza v triede contribution (< div class = "contribution"> komentár </ div>). V každom komentári je uvedený autor (<h4 class = "name"> autor </ h4>), dátum, umiestnený v tagu span, ktorý je v triede infoDate (<div class = "infoDate"> dátum </ span > </ div>) a samotný text príspevku (<div class = "content"> text </ div>). Ak by sme mali byť dôslední, text príspevku je v tagu

</ p> a tento tag je v triede content. Keďže daná trieda nemá iný text, než komentár, nie je táto presnosť potrebná narozdiel od triedy infoDate, ktorá obsahuje okrem dátumu aj odkazy pre hlasovanie (súhlasím, nesúhlasím) a skóre hlasovania.

Element contributions = doc.select(selectorContributions).first();

Hľadáme <div id = "contributions"> (premenná selectorContri­butions = "div # contributions"). Môžeme použiť aj druhý spôsob

Element contributions = doc.getElementById("contributions");
Elements selectedDivs = contributions.select(selectorContribution);

Vo predtým vybranej oblasti (táto oblasť obsahuje div s id contributions) hľadáme div s triedou contribution (<div class = "contribution">).

String selectorName = "h4.name";
String selectorDate = "div.infoDate span";
String selectorContent = "div.content";

h4.name (<h4 class = "name"> </ h4>)
div.infoDate span (<div class = "infoDate"> </ span> </ div>)
div.content (<div class = "content"> </ div>)

Viac k vyhľadávaniu elementov nájdete na tu. To je všetko. Dúfam, že vám knižnica Jsoup bude na úžitok.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 163x (1.97 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Všetky články v sekcii
Java - Pre pokročilých
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity