Analýza HTML v Jave pomocou Jsoup

1. Prehľad

Jsoup je open source knižnica Java používaná hlavne na extrakciu dát z HTML. Umožňuje vám tiež manipulovať a vydávať HTML. Má stálu vývojovú líniu, skvelú dokumentáciu a plynulé a flexibilné rozhranie API. Jsoup sa dá použiť aj na analýzu a zostavenie XML.

V tomto tutoriále použijeme jarný blog na ilustráciu škrabania, ktoré demonštruje niekoľko funkcií súp:

  • Načítava sa: načítanie a analýza kódu HTML do a Dokument
  • Filtrovanie: výber požadovaných údajov do Prvky a prechádzať to
  • Extrahovanie: získanie atribútov, textu a HTML uzlov
  • Úpravy: pridanie / úprava / odstránenie uzlov a úprava ich atribútov

2. Závislosť od Maven

Ak chcete vo svojom projekte použiť knižnicu jsoup, pridajte závislosť do svojho pom.xml:

 org.jsoup jsoup 1.10.2 

Najnovšiu verziu súpu nájdete v centrálnom úložisku Maven.

3. Jsoup v skratke

Spoločnosť Jsoup načíta stránku HTML a vytvorí zodpovedajúci strom DOM. Tento strom funguje rovnakým spôsobom ako DOM v prehľadávači a ponúka metódy podobné ako jQuery a vanilla JavaScript na výber, prechádzanie, manipuláciu s textom / HTML / atribútmi a pridávanie / odstraňovanie prvkov.

Ak vám vyhovujú selektory na strane klienta a prechádzanie / manipulácia s DOM, zistíte, že jsoup veľmi dobre známe. Skontrolujte, aké ľahké je tlačiť odseky stránky:

Dokument doc = Jsoup.connect ("// example.com"). Get (); doc.select ("p"). forEach (System.out :: println);

Majte na pamäti, že jsoup interpretuje iba HTML - neinterpretuje JavaScript. Preto zmeny v DOM, ktoré by za normálnych okolností nastali po načítaní stránky v prehliadači s povoleným JavaScriptom, sa v súp nezobrazia.

4. Načítanie

Fáza načítania zahrnuje načítanie a analýzu kódu HTML do a Dokument. Spoločnosť Jsoup zaručuje analýzu akéhokoľvek kódu HTML, od najneplatnejších po úplne overené, ako to robí moderný prehliadač. Dá sa to dosiahnuť načítaním a String, an InputStream, a Súbor alebo URL.

Naložíme a Dokument z adresy URL jarného blogu:

Reťazec blogUrl = "//spring.io/blog"; Dokument doc = Jsoup.connect (blogUrl) .get ();

Všimnite si dostať metóda predstavuje volanie HTTP GET. Môžete tiež urobiť HTTP POST s príspevok metóda (alebo môžete použiť a metóda ktorý ako parameter prijíma typ metódy HTTP).

Ak potrebujete zistiť abnormálne stavové kódy (napr. 404), mali by ste chytiť HttpStatusException výnimka:

skúsiť {Document doc404 = Jsoup.connect ("// spring.io/will-not-be-found"). get (); } catch (HttpStatusException ex) {// ...}

Niekedy je potrebné pripojenie trochu viac prispôsobiť. Jsoup.connect (…) vracia a Pripojenie ktorý vám okrem iného umožňuje nastaviť užívateľského agenta, sprostredkovateľa, časový limit pripojenia, cookies, údaje o príspevku a hlavičky:

Pripojenie pripojenia = Jsoup.connect (blogUrl); connection.userAgent ("Mozilla"); pripojenie.časový limit (5 000); connection.cookie ("cookiename", "val234"); connection.cookie ("cookiename", "val234"); connection.referrer ("// google.com"); connection.header ("headersecurity", "xyz123"); Dokument docCustomConn = connection.get ();

Pretože pripojenie sleduje plynulé rozhranie, môžete tieto metódy pred volaním požadovanej metódy HTTP zreťaziť:

Dokument docCustomConn = Jsoup.connect (blogUrl) .userAgent ("Mozilla") .timeout (5000) .cookie ("cookiename", "val234") .cookie ("anothercookie", "ilovejsoup") .referrer ("// google .com ") .header (" headersecurity "," xyz123 ") .get ();

Môžete sa dozvedieť viac o Pripojenie nastavenia prehľadaním príslušného Javadocu.

5. Filtrovanie

Teraz, keď máme kód HTML prevedený na a Dokument, je čas sa v ňom zorientovať a nájsť to, čo hľadáme. To je miesto, kde je zjavnejšia podobnosť s jQuery / JavaScript, pretože jeho selektory a metódy prechodu sú podobné.

5.1. Vyberám

The Dokumentvyberte metóda prijíma a String predstavujúci selektor pomocou rovnakej syntaxe selektora ako v CSS alebo JavaScripte a získa zodpovedajúci zoznam Prvky. Tento zoznam môže byť prázdny, ale nie nulový.

Poďme sa pozrieť na niektoré výbery pomocou vyberte metóda:

Odkazy na prvky = doc.select ("a"); Sekcie prvkov = doc.select ("sekcia"); Prvky logo = doc.select (". Pružina-logo - kontajner"); Prvky stránkovanie = doc.select ("# pagination_control"); Prvky divsDescendant = doc.select ("záhlavie div"); Prvky divsDirect = doc.select ("hlavička> div");

Namiesto všeobecných metód môžete tiež použiť explicitnejšie metódy inšpirované DOM prehliadača vyberte:

Prvok pag = doc.getElementById ("pagination_control"); Prvky desktopOnly = doc.getElementsByClass ("desktopOnly");

Odkedy Element je nadtrieda Dokument, môžete sa dozvedieť viac o práci s metódami výberu v Dokument a Element Javadocs.

5.2. Traversing

Traverzovanie znamená navigáciu po strome DOM. Jsoup poskytuje metódy, ktoré pracujú na Dokument, na súbore Prvky, alebo na konkrétnom Element, ktorá vám umožní navigovať k rodičom, súrodencom alebo deťom uzla.

Môžete tiež prejsť na prvú, poslednú a n-tu (pomocou indexu založeného na 0). Element v súbore Prvky:

Prvok firstSection = sections.first (); Element lastSection = oddiely.last (); Prvok secondSection = sections.get (2); Prvky allParents = firstSection.parents (); Element rodič = firstSection.parent (); Prvky deti = firstSection.children (); Súrodenci prvkov = firstSection.siblingElements ();

Môžete tiež iterovať prostredníctvom výberov. V skutočnosti čokoľvek typu Prvky možno opakovať:

sections.forEach (el -> System.out.println ("oddiel:" + el));

Výber môžete obmedziť na predchádzajúci výber (podvýber):

Elements sectionParagraphs = firstSection.select (". Odsek");

6. Extrahovanie

Teraz už vieme, ako dosiahnuť konkrétne prvky, takže je čas získať ich obsah - konkrétne ich atribúty, HTML alebo podradený text.

Zoznámte sa s týmto príkladom, ktorý vyberie prvý článok z blogu a získa jeho dátum, text jeho prvej sekcie a nakoniec jeho vnútorný a vonkajší HTML:

Prvok firstArticle = doc.select ("článok"). First (); Element timeElement = firstArticle.select ("time"). First (); Reťazec dateTimeOfFirstArticle = timeElement.attr ("datetime"); Element sectionDiv = firstArticle.select ("oddiel div"). First (); Reťazec sectionDivText = sectionDiv.text (); Reťazec articleHtml = firstArticle.html (); Reťazec vonkajšíHtml = firstArticle.outerHtml ();

Pri výbere a používaní selektorov nezabudnite na niekoľko rád:

  • Spoliehajte sa na funkciu „Zobraziť zdroj“ vášho prehliadača a nielen na stránku DOM, pretože sa mohla zmeniť (výber v konzole prehliadača môže priniesť odlišné výsledky ako jsoup)
  • Poznajte svojich selektorov, pretože ich je veľa a vždy je dobré ich aspoň vidieť; zvládnutie selektorov si vyžaduje čas
  • Použite ihrisko pre selektorov na experimentovanie s nimi (vložte tam ukážkový HTML)
  • Buďte menej závislí na zmenách stránky: zamerajte sa na najmenší a najmenej kompromitujúci selektor (napr. Uprednostňujte identifikáciu)

7. Úpravy

Úpravy zahŕňajú nastavenie atribútov, textu a HTML prvkov, ako aj pridanie a odstránenie prvkov. Vykonáva sa to na strome DOM, ktorý predtým vygeneroval Dokument.

7.1. Nastavenie atribútov a vnútorného textu / HTML

Rovnako ako v jQuery, aj metódy na nastavenie atribútov, textu a HTML majú rovnaké názvy, ale dostávajú aj nastavenú hodnotu:

  • attr () - nastaví hodnoty atribútu (vytvorí atribút, ak neexistuje)
  • text () - nastaví vnútorný text prvku a nahradí obsah
  • html () - nastaví vnútorné HTML prvku a nahradí obsah

Pozrime sa na rýchly príklad týchto metód:

timeElement.attr ("datetime", "2016-12-16 15: 19: 54,3"); sectionDiv.text ("foo bar"); firstArticle.select ("h2"). html (""); 

7.2. Vytváranie a pripájanie prvkov

Ak chcete pridať nový prvok, musíte ho najskôr vytvoriť pomocou inštancie Element. Raz Element bol postavený, môžete ho pridať k inému Element pomocou appendChild metóda. Novo vytvorené a pripojené Element sa vloží na koniec prvku kde appendChild sa volá:

Link link = new Element (Tag.valueOf ("a"), "") .text ("Pokladňa na tejto úžasnej webovej stránke!") .Attr ("href", "//baeldung.com") .attr ("cieľ") , „_blank“); firstArticle.appendChild (odkaz);

7.3. Odstraňovanie prvkov

Ak chcete odstrániť prvky, musíte ich najskôr vybrať a spustiť odstrániť metóda.

Napríklad odstránime všetky

  • značky, ktoré obsahujú „navbar-link “ trieda z Dokument, a všetky obrázky z prvého článku:

    doc.select ("li.navbar-link"). remove (); firstArticle.select ("img"). remove ();

    7.4. Prevod upraveného dokumentu do HTML

    Nakoniec, keď sme menili Dokument, možno by sme mali skontrolovať našu prácu.

    Za týmto účelom môžeme preskúmať Dokument Strom DOM výberom, prechádzaním a extrakciou pomocou predložených metód, alebo môžeme jednoducho extrahovať jeho HTML ako a String pomocou html () metóda:

    Reťazec docHtml = doc.html ();

    The String výstupom je upravené HTML.

    8. Záver

    Jsoup je skvelá knižnica na zoškrabanie ktorejkoľvek stránky. Ak používate jazyk Java a nevyžadujete vytváranie prehľadávačov, je potrebné zohľadniť túto knižnicu. Je známy a ľahko použiteľný, pretože využíva vedomosti, ktoré môžete mať v oblasti front-end vývoja, a dodržiava osvedčené postupy a vzory návrhov.

    Viac informácií o škrabaní webových stránok pomocou typup sa dozviete tak, že si preštudujete API aplikace arep a prečítate si kuchársku knihu jsoup.

    Zdrojový kód použitý v tejto príručke nájdete v projekte GitHub.


    $config[zx-auto] not found$config[zx-overlay] not found