Raščlanjivanje HTML-a u Javi s Jsoupom

1. Pregled

Jsoup je Java biblioteka otvorenog koda koja se uglavnom koristi za izdvajanje podataka iz HTML-a. Također vam omogućuje manipulaciju i izlaz HTML-a. Ima stabilnu razvojnu liniju, izvrsnu dokumentaciju i tečan i fleksibilan API. Jsoup se također može koristiti za raščlanjivanje i izgradnju XML-a.

U ovom uputstvu koristit ćemo Spring Blog kako bismo ilustrirali vježbu struganja koja pokazuje nekoliko značajki jsoupa:

  • Učitavanje: dohvaćanje i raščlanjivanje HTML-a u Dokument
  • Filtriranje: odabir željenih podataka u Elementi i prelazeći ga
  • Izdvajanje: dobivanje atributa, teksta i HTML čvorova
  • Izmjena: dodavanje / uređivanje / uklanjanje čvorova i uređivanje njihovih atributa

2. Ovisnost Mavena

Da biste koristili jsoup biblioteku u svom projektu, dodajte ovisnost u svoj pom.xml:

 org.jsoup jsoup 1.10.2 

Najnoviju verziju jsoupa možete pronaći u spremištu Maven Central.

3. Jsoup na prvi pogled

Jsoup učitava HTML stranice i gradi odgovarajuće DOM stablo. Ovo stablo radi na isti način kao i DOM u pregledniku, nudeći metode slične jQueryju i vanilla JavaScript-u za odabir, prelazak, manipulaciju tekstom / HTML / atributima i dodavanje / uklanjanje elemenata.

Ako vam prijaju birači na strani klijenta i DOM prelazak / manipulacija, naći ćete jsoup vrlo poznatim. Provjerite koliko je jednostavno ispisati odlomke stranice:

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

Imajte na umu da jsoup tumači samo HTML - ne tumači JavaScript. Stoga se promjene u DOM-u koje bi se obično dogodile nakon učitavanja stranice u pregledniku s omogućenim JavaScriptom neće vidjeti u jsoupu.

4. Učitavanje

Faza učitavanja obuhvaća dohvaćanje i raščlanjivanje HTML-a u Dokument. Jsoup jamči raščlanjivanje bilo kojeg HTML-a, od najnevaljanijeg do potpuno provjerenog, kao što bi to učinio moderni preglednik. To se može postići učitavanjem a Niz, an InputStream, a Datoteka ili URL.

Učitajmo a Dokument s URL-a proljetnog bloga:

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

Primijetite dobiti metoda predstavlja HTTP GET poziv. Također možete napraviti HTTP POST s post metodom (ili biste mogli koristiti a metoda koja kao parametar prima tip metode HTTP).

Ako trebate otkriti abnormalne statusne kodove (npr. 404), trebali biste uhvatiti HttpStatusException iznimka:

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

Ponekad vezu treba malo prilagoditi. Jsoup.connect (...) vraća a Veza koji vam omogućuje da, između ostalog, postavite korisničkog agenta, preporuku, vremensko ograničenje veze, kolačiće, podatke o postovima i zaglavlja:

Veza veze = Jsoup.connect (blogUrl); connection.userAgent ("Mozilla"); connection.timeout (5000); connection.cookie ("naziv kolačića", "val234"); connection.cookie ("naziv kolačića", "val234"); connection.referrer ("// google.com"); connection.header ("headersecurity", "xyz123"); Dokument docCustomConn = connection.get ();

Budući da veza slijedi tečno sučelje, ove metode možete povezati prije pozivanja željene HTTP metode:

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

Možete saznati više o Veza postavke pregledavanjem odgovarajućeg Javadoca.

5. Filtriranje

Sad kad smo HTML pretvorili u Dokument, vrijeme je za navigaciju i pronalazak onoga što tražimo. Tu je sličnost s jQueryjem / JavaScriptom očiglednija, jer su njegovi selektori i metode prelaska slični.

5.1. Odabir

The DokumentOdaberi metoda prima a Niz predstavlja selektor, koristeći istu sintaksu selektora kao u CSS-u ili JavaScript-u, i dohvaća odgovarajući popis Elementi. Ovaj popis može biti prazan, ali ne null.

Pogledajmo neke izbore pomoću Odaberi metoda:

Poveznice elemenata = doc.select ("a"); Odjeljci elemenata = doc.select ("odjeljak"); Logotip elemenata = doc.select (". Spring-logo - container"); Elementi paginacija = doc.select ("# pagination_control"); Elementi divsDescendant = doc.select ("zaglavlje div"); Elementi divsDirect = doc.select ("zaglavlje> div");

Također možete koristiti eksplicitnije metode nadahnute preglednikom DOM umjesto generičkih Odaberi:

Element pag = doc.getElementById ("pagination_control"); Elementi desktopOnly = doc.getElementsByClass ("desktopOnly");

Od Element je superklasa od Dokument, možete saznati više o radu s metodama odabira u Dokument i Element Javadocs.

5.2. Prelazak

Prelazak znači navigaciju kroz DOM stablo. Jsoup pruža metode koje djeluju na Dokument, na skupu od Elementi, ili na određenom Element, omogućujući vam navigaciju do roditelja, braće i sestara ili djece čvora.

Također, možete skočiti na prvu, zadnju i n-tu (pomoću indeksa temeljenog na 0) Element u skupu od Elementi:

Element firstSection = section.first (); Element lastSection = section.last (); Element secondSection = section.get (2); Elementi allParents = firstSection.parents (); Element nadređeni = firstSection.parent (); Elementi children = firstSection.children (); Elementi braća i sestre = firstSection.siblingElements ();

Također možete ponavljati odabire. Zapravo, bilo što od tipa Elementi može se ponoviti:

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

Možete izvršiti odabir ograničen na prethodni odabir (podizbor):

Elementi sectionParagraphs = firstSection.select (". Odlomak");

6. Izdvajanje

Sada znamo kako doći do određenih elemenata, pa je vrijeme da dobijemo njihov sadržaj - naime njihove atribute, HTML ili podređeni tekst.

Pogledajte ovaj primjer koji odabire prvi članak s bloga i dobiva datum, tekst prvog odjeljka i na kraju unutarnji i vanjski HTML:

Element firstArticle = doc.select ("članak"). First (); Element timeElement = firstArticle.select ("vrijeme"). First (); Niz dateTimeOfFirstArticle = timeElement.attr ("datetime"); Element sectionDiv = firstArticle.select ("section div"). First (); Niz sectionDivText = sectionDiv.text (); String articleHtml = firstArticle.html (); Niz externalHtml = firstArticle.outerHtml ();

Evo nekoliko savjeta koje morate imati na umu pri odabiru i korištenju selektora:

  • Oslonite se na značajku "View Source" vašeg preglednika, a ne samo na stranici DOM jer se ona možda promijenila (odabir na konzoli preglednika može dati drugačije rezultate od jsoupa)
  • Upoznajte svoje selektore jer ih ima puno i uvijek je dobro da ste ih barem vidjeli prije; savladavanje selektora zahtijeva vrijeme
  • Koristite igralište za selektore da eksperimentiraju s njima (tamo zalijepite uzorak HTML-a)
  • Budite manje ovisni o promjenama stranica: ciljajte na najmanje i najmanje kompromitirajuće birače (npr. Radije id. Temeljen)

7. Modificiranje

Izmjena obuhvaća postavljanje atributa, teksta i HTML elemenata, kao i dodavanje i uklanjanje elemenata. Radi se na DOM stablu koje je prethodno generirao jsoup - Dokument.

7.1. Postavljanje atributa i unutarnjeg teksta / HTML-a

Kao i u jQueryju, metode postavljanja atributa, teksta i HTML-a nose ista imena, ali također dobivaju vrijednost koju treba postaviti:

  • attr () - postavlja vrijednosti atributa (stvara atribut ako ne postoji)
  • tekst() - postavlja unutarnji tekst elementa, zamjenjujući sadržaj
  • html () - postavlja unutarnji HTML elementa, zamjenjujući sadržaj

Pogledajmo kratki primjer ovih metoda:

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

7.2. Stvaranje i dodavanje elemenata

Da biste dodali novi element, prvo ga morate izgraditi instanciranjem Element. Jednom Element je izgrađen, možete ga dodati drugom Element koristiti dodaj dijete metoda. Novostvoreno i dodano Element bit će umetnuto na kraju elementa gdje dodaj dijete Zove se:

Veza do elementa = novi Element (Tag.valueOf ("a"), "") .text ("Checkout this amazing web!") .Attr ("href", "//baeldung.com") .attr ("target" , "_prazno"); firstArticle.appendChild (veza);

7.3. Uklanjanje elemenata

Da biste uklonili elemente, prvo ih morate odabrati i pokrenuti ukloniti metoda.

Na primjer, uklonimo sve

  • oznake koje sadrže "navbar-link " razred iz Dokument, i sve slike iz prvog članka:

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

    7.4. Pretvaranje modificiranog dokumenta u HTML

    Napokon, budući da smo mijenjali Dokument, možda bismo željeli provjeriti svoj rad.

    Da bismo to učinili, možemo istražiti Dokument DOM stablo odabirom, prelaskom i izvlačenjem pomoću predstavljenih metoda ili možemo jednostavno izdvojiti njegov HTML kao Niz koristiti html () metoda:

    Niz docHtml = doc.html ();

    The Niz izlaz je uredan HTML.

    8. Zaključak

    Jsoup je sjajna biblioteka za struganje bilo koje stranice. Ako upotrebljavate Javu i ne trebate struganje na temelju preglednika, to treba uzeti u obzir knjižnica. Poznat je i lagan za upotrebu jer koristi znanje koje imate o front-end razvoju te slijedi dobre prakse i obrasce dizajna.

    Možete naučiti više o struganju web stranica s jsoup proučavanjem jsoup API-ja i čitanjem jsoup kuharice.

    Izvorni kod korišten u ovom vodiču može se naći u projektu GitHub.


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