Analyse av HTML i Java med Jsoup

1. Oversikt

Jsoup er et open source Java-bibliotek som hovedsakelig brukes til å trekke ut data fra HTML. Det lar deg også manipulere og sende HTML. Den har en jevn utviklingslinje, god dokumentasjon og et flytende og fleksibelt API. Jsoup kan også brukes til å analysere og bygge XML.

I denne opplæringen bruker vi vårbloggen til å illustrere en skrapøvelse som demonstrerer flere funksjoner i jsoup:

  • Laster inn: henter og analyserer HTML-en i en Dokument
  • Filtrering: velge ønsket data i Elementer og krysser den
  • Utpakking: skaffe attributter, tekst og HTML for noder
  • Endring: legge til / redigere / fjerne noder og redigere attributtene

2. Maven avhengighet

For å gjøre bruk av jsoup-biblioteket i prosjektet ditt, legg til avhengigheten til din pom.xml:

 org.jsoup jsoup 1.10.2 

Du finner den nyeste versjonen av jsoup i Maven Central repository.

3. Jsoup i et blikk

Jsoup laster siden HTML og bygger det tilsvarende DOM-treet. Dette treet fungerer på samme måte som DOM i en nettleser, og tilbyr metoder som ligner på jQuery og vanilje JavaScript for å velge, krysse, manipulere tekst / HTML / attributter og legge til / fjerne elementer.

Hvis du er komfortabel med klientsiden og DOM-traversering / manipulering, vil du finne jsoup veldig kjent. Sjekk hvor enkelt det er å skrive ut avsnittene på en side:

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

Husk at jsoup bare tolker HTML - det tolker ikke JavaScript. Derfor vil ikke endringer i DOM som normalt vil finne sted etter at siden er lastet inn i en JavaScript-aktivert nettleser, bli sett i jsoup.

4. Lasting

Lastingsfasen omfatter henting og parsing av HTML til en Dokument. Jsoup garanterer analysering av hvilken som helst HTML, fra den mest ugyldige til den helt validerte, slik en moderne nettleser ville gjort. Det kan oppnås ved å laste inn en String, en InputStream, a Fil eller en URL.

La oss laste inn en Dokument fra vårbloggen URL:

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

Legg merke til metode representerer den en HTTP GET-samtale. Du kan også gjøre en HTTP POST med post metode (eller du kan bruke en metode som mottar HTTP-metotypen som parameter).

Hvis du trenger å oppdage unormale statuskoder (f.eks. 404), bør du ta tak i HttpStatusException unntak:

prøv {Document doc404 = Jsoup.connect ("// spring.io/will-not-be-found"). get (); } fangst (HttpStatusException ex) {// ...}

Noen ganger må forbindelsen være litt mer tilpasset. Jsoup.connect (…) returnerer a Forbindelse som lar deg angi blant annet brukeragenten, henviseren, tidsavbrudd for tilkobling, informasjonskapsler, innleggsdata og overskrifter:

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

Siden forbindelsen følger et flytende grensesnitt, kan du kjede disse metodene før du ringer til ønsket HTTP-metode:

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

Du kan lære mer om Forbindelse innstillinger ved å bla i tilsvarende Javadoc.

5. Filtrering

Nå som vi har konvertert HTML til en Dokument, det er på tide å navigere i det og finne det vi leter etter. Dette er hvor likheten med jQuery / JavaScript er tydeligere, ettersom valgene og kryssingsmetodene er like.

5.1. Velger

De Dokumentå velge metoden mottar en String som representerer velgeren, ved hjelp av samme selektor-syntaks som i en CSS eller JavaScript, og henter samsvarende liste over Elementer. Denne listen kan være tom, men ikke null.

La oss ta en titt på noen valg ved hjelp av å velge metode:

Elements links = doc.select ("a"); Elementseksjoner = doc.select ("seksjon"); Elements logo = doc.select (". Spring-logo - container"); Elements pagination = doc.select ("# pagination_control"); Elements divsDescendant = doc.select ("header div"); Elements divsDirect = doc.select ("header> div");

Du kan også bruke mer eksplisitte metoder inspirert av nettleseren DOM i stedet for det generiske å velge:

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

Siden Element er en superklasse av Dokument, kan du lære mer om å jobbe med valgmetodene i Dokument og Element Javadocs.

5.2. Traversering

Å krysse betyr å navigere over DOM-treet. Jsoup tilbyr metoder som fungerer på Dokument, på et sett med Elementer, eller på en bestemt Element, slik at du kan navigere til en nodes foreldre, søsken eller barn.

Du kan også hoppe til den første, den siste og den nte (ved hjelp av en 0-basert indeks) Element i et sett med Elementer:

Element firstSection = seksjoner. Første (); Element lastSection = seksjoner. Siste (); Element secondSection = seksjoner.get (2); Elements allParents = firstSection.parents (); Elementforelder = firstSection.parent (); Elementer barn = firstSection.children (); Elements søsken = firstSection.siblingElements ();

Du kan også gjenta gjennom valg. Faktisk noe av typen Elementer kan gjentas:

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

Du kan gjøre et utvalg begrenset til et forrige valg (undervalg):

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

6. Ekstrahering

Vi vet nå hvordan vi kan nå bestemte elementer, så det er på tide å få innholdet deres - nemlig attributtene, HTML eller underordnet tekst.

Ta en titt på dette eksemplet som velger den første artikkelen fra bloggen og får datoen, den første seksjonsteksten og til slutt den indre og ytre HTML:

Element firstArticle = doc.select ("artikkel"). First (); Element timeElement = firstArticle.select ("tid"). First (); String dateTimeOfFirstArticle = timeElement.attr ("datetime"); Element sectionDiv = firstArticle.select ("seksjon div"). First (); Streng seksjonDivText = seksjonDiv.text (); StrengartikkelHtml = firstArticle.html (); Streng outerHtml = firstArticle.outerHtml ();

Her er noen tips du må huske på når du velger og bruker velgere:

  • Stol på "Vis kilde" -funksjonen i nettleseren din og ikke bare på siden DOM, siden den kan ha endret seg (valg på nettleserkonsollen kan gi andre resultater enn jsoup)
  • Kjenn velgerne dine, da det er mange av dem, og det er alltid bra å i det minste ha sett dem før; å mestre velgerne tar tid
  • Bruk en lekeplass for velgere for å eksperimentere med dem (lim inn en prøve HTML der)
  • Vær mindre avhengig av sideendringer: sikte på de minste og minst kompromitterende velgerne (f.eks. Foretrekker id. Basert)

7. Modifisering

Endring inkluderer innstillingsattributter, tekst og HTML for elementer, samt å legge til og fjerne elementer. Det gjøres mot DOM-treet som tidligere ble generert av jsoup - the Dokument.

7.1. Angi attributter og indre tekst / HTML

Som i jQuery, har metodene for å angi attributter, tekst og HTML samme navn, men mottar også verdien som skal angis:

  • attr () - angir verdiene til et attributt (det oppretter attributtet hvis det ikke eksisterer)
  • tekst() - setter elementets indre tekst, erstatter innholdet
  • html () - setter elementets indre HTML, erstatter innhold

La oss se på et raskt eksempel på disse metodene:

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

7.2. Opprette og legge til elementer

For å legge til et nytt element, må du bygge det først ved å starte det Element. Først når Element er bygget, kan du legge den til en annen Element bruker appendChild metode. Det nyopprettede og vedlagte Element vil bli satt inn på slutten av elementet der appendChild er kalt:

Element link = new Element (Tag.valueOf ("a"), "") .text ("Checkout this amazing website!") .Attr ("href", "//baeldung.com") .attr ("target" , "_ blank"); firstArticle.appendChild (lenke);

7.3. Fjerne elementer

For å fjerne elementer må du først velge dem og kjøre fjerne metode.

La oss for eksempel fjerne alt

  • tagger som inneholder “navbar-link ” klasse fra Dokument, og alle bilder fra den første artikkelen:

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

    7.4. Konvertering av det modifiserte dokumentet til HTML

    Endelig, siden vi endret Dokument, kan det være lurt å sjekke arbeidet vårt.

    For å gjøre dette kan vi utforske Dokument DOM-tre ved å velge, krysse og trekke ut ved hjelp av de presenterte metodene, eller vi kan ganske enkelt trekke ut HTML-en som en String bruker html () metode:

    Streng docHtml = doc.html ();

    De String output er en ryddig HTML.

    8. Konklusjon

    Jsoup er et flott bibliotek for å skrape hvilken som helst side. Hvis du bruker Java og ikke trenger nettleserbasert skraping, er det et bibliotek du må ta i betraktning. Det er kjent og lett å bruke siden det bruker kunnskapen du kan ha om front-end-utvikling og følger god praksis og designmønstre.

    Du kan lære mer om å skrape websider med jsoup ved å studere jsoup API og lese jsoup kokebok.

    Kildekoden som brukes i denne opplæringen, finner du i GitHub-prosjektet.


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