Parsování HTML v Javě s knihovnou Jsoup - pokračování

Java Pro pokročilé Parsování HTML v Javě s knihovnou Jsoup - pokračování

Pokračování tutoriálu o knihovně Jsoup, která se používá pro načítání, vyhledávání a manipulaci 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]");

Vyhledání všech elementů a, které mají atribut href.

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

Získání a výpis relativní url.

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

Získání a výpis absolutní url. Zde jsou uvedeny dva možné způsoby a záleží na vás, který si vyberete. To stejné platí i pro elementy img, kde také nejdříve získáme a vypíšeme relativní url atributu src a poté absolutní url. Opět jsou uvedeny oba způsoby získání absolutní 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ávěr vypíšeme počet odkazů a obrázků a jejich absolutní url.

Atributy

public class Jsoup06 {
        private static String urlString = "http://www.devbook.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čte stránku na zadaném url, najde všechny odkazy, které mají atribut target a pokud má daný odkaz nějaký text, vypíše text a následně celý odkaz. Pak vyhledá všechny obrázky s atributem alt a v případě, že atribut alt má tři a více znaků, vypíše hodnotu tohoto atributu a posléze i celý img element.

Procházení diskuze

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 se nachází diskuze. Pokud se podíváte do zdrojového kódu stránky, tak zjistíte, že oblast, ve které se nacházejí komentáře, má id contributions (<div id="contributions"> oblast s komentáři </div>), každý komentář se nachází ve třídě contribution (<div class="contri­bution"> komentář </div>). V každém komentáři je uveden autor (<h4 class="name"> autor </h4>), datum, umístěný v tagu span, který je ve třídě infoDate (<div class="infoDa­te"><span> datum </span></div>) a samotný text příspěvku (<div class="content"> text </div>). Pokud bychom měli být důslední, text příspěvku je v tagu <p> </p> a tento tag je ve třídě content. Jelikož daná třída nemá jiný text, než komentář, není tato přesnost nutná narozdíl od trídy infoDate, která obsahuje kromě data i odkazy pro hlasování (souhlasím, nesouhlasím) a skóre hlasování.

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

Hledáme <div id="contributions"> (proměnná selectorContri­butions = "div#contribu­tions"). Můžeme použít i druhý způsob

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

Ve dříve vybrané oblasti (tato oblast obsahuje div s id contributions) hledáme div s třídou contribution (<div class="contri­bution">).

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> </span> </div>)
div.content (<div class="content"> </div>)

Více k vyhledávání elementů naleznete na zde. To je vše. Doufám, že vám knihovna Jsoup bude k užitku.


 

Stáhnout

Staženo 142x (1.97 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

  Aktivity (1)

Článek pro vás napsal vita
Avatar
vita

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.754.754.754.754.75


 


Miniatura
Všechny články v sekci
Java - Pro pokročilé

 

 

Komentáře

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Hezky jsi to zpracoval na ty jednotlivé příklady :)

Odpovědět 16.11.2013 11:01
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Vakos
Redaktor
Avatar
Vakos:

Jak by se dalo udělat, aby když nenajde daný element, tak aby tomu dal například nulovou hodnotu a pokračoval?

Odpovědět 22.3.2015 17:08
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.