HTML elemzése Java-ban a Jsoup-tal

1. Áttekintés

A Jsoup egy nyílt forráskódú Java könyvtár, amelyet elsősorban adatok HTML-ből történő kinyerésére használnak. Ez lehetővé teszi a HTML manipulálását és kimenetét is. Stabil fejlesztési vonallal, nagyszerű dokumentációval és folyékony és rugalmas API-val rendelkezik. A Jsoup használható XML elemzésére és felépítésére is.

Ebben az oktatóanyagban a Tavaszi Blog segítségével szemléltetjük a kaparási gyakorlatot, amely bemutatja a jsoup számos jellemzőjét:

  • Betöltés: a HTML beolvasása és elemzése a Dokumentum
  • Szűrés: a kívánt adatok kiválasztása Elemek és bejárja azt
  • Kibontás: a csomópontok attribútumainak, szövegének és HTML-jének megszerzése
  • Módosítás: csomópontok hozzáadása / szerkesztése / eltávolítása és azok attribútumainak szerkesztése

2. Maven-függőség

A projektben a jsoup könyvtár használatához adja hozzá a függőséget pom.xml:

 org.jsoup jsoup 1.10.2 

A jsoup legújabb verzióját a Maven Central adattárban találja meg.

3. Jsoup egy pillantásra

A Jsoup betölti az oldal HTML-jét, és felépíti a megfelelő DOM fát. Ez a fa ugyanúgy működik, mint a böngészőben található DOM, a jQuery és a vanilla JavaScripthez hasonló módszereket kínálva a szöveg / HTML / attribútumok kiválasztására, bejárására, manipulálására és az elemek hozzáadására / eltávolítására.

Ha jól érzi magát az ügyféloldali szelektorokkal és a DOM-ban való mozgással / manipulációval, akkor a jsoup-ot nagyon ismerősnek találja. Ellenőrizze, hogy mennyire egyszerű kinyomtatni az oldal bekezdéseit:

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

Ne feledje, hogy a jsoup csak a HTML-t értelmezi - nem értelmezi a JavaScript-et. Ezért a DOM azon változásai, amelyek általában a JavaScript-képes böngészőben az oldal betöltése után következnek be, nem lesznek láthatók a jsoup-ban.

4. Betöltés

A betöltési szakasz a HTML beolvasását és elemzését tartalmazza a Dokumentum. A Jsoup garantálja minden HTML elemzését, a legérvénytelenebbektől a teljesen validáltakig, ahogy egy modern böngésző is tenné. Meg lehet tölteni a Húr, an InputStream, a File vagy egy URL-t.

Töltsük be a Dokumentum a tavaszi blog URL-jéből:

Karakterlánc blogUrl = "//spring.io/blog"; Document doc = Jsoup.connect (blogUrl) .get ();

Figyelje meg a kap metódus, ez egy HTTP GET hívást jelent. Megteheti a HTTP POST-ot is a post metódus (vagy használhatja a módszer amely paraméterként megkapja a HTTP metódustípust).

Ha rendellenes állapotkódokat kell észlelnie (pl. 404), akkor el kell kapnia a HttpStatusException kivétel:

próbálkozzon a {Document doc404 = Jsoup.connect ("// spring.io/will-not-be-found"). get (); } catch (HttpStatusException ex) {// ...}

Néha a kapcsolatot kissé testre kell szabni. Jsoup.connect (…) visszatér a Kapcsolat amely lehetővé teszi többek között a felhasználói ügynök, a hivatkozó, a kapcsolat időkorlátjának, a cookie-k, az adatok közzététele és a fejlécek beállítását:

Kapcsolati kapcsolat = Jsoup.connect (blogUrl); connection.userAgent ("Mozilla"); kapcsolat.időkorlát (5000); connection.cookie ("cookiename", "val234"); connection.cookie ("cookiename", "val234"); connection.referrer ("// google.com"); connection.header ("fejlécbiztonság", "xyz123"); DocCustomConn = connection.get () dokumentum;

Mivel a kapcsolat folyékony felületet követ, ezeket a módszereket láncolhatja, mielőtt meghívná a kívánt HTTP-módszert:

Dokumentum docCustomConn = Jsoup.connect (blogUrl) .userAgent ("Mozilla") .timeout (5000) .cookie ("cookiename", "val234") .cookie ("anothercookie", "ilovejsoup") .referrer ("// google .com ") .header (" fejlécbiztonság "," xyz123 ") .get ();

Tudjon meg többet a Kapcsolat beállításokat a megfelelő Javadoc böngészésével.

5. Szűrés

Most, hogy a HTML-t a-vá alakítottuk át Dokumentum, itt az ideje eligazodni benne, és megtalálni azt, amit keresünk. Itt nyilvánvalóbb a hasonlóság a jQuery / JavaScript-szel, mivel szelektorai és bejárási módjai hasonlóak.

5.1. Kiválasztása

A Dokumentumválassza módszer megkapja a Húr a szelektor képviselete, ugyanazzal a szelektor-szintaxissal, mint egy CSS-ben vagy a JavaScript-ben, és lekéri a Elemek. Ez a lista lehet üres, de nem nulla.

Vessen egy pillantást néhány választásra a válassza módszer:

Elements links = doc.select ("a"); Elemek szakaszok = doc.select ("szakasz"); Elements embléma = doc.select (". Rugós logó - konténer"); Elemek lapozás = doc.select ("# pagination_control"); Elemek divsDescendant = doc.select ("header div"); Elemek divsDirect = doc.select ("header> div");

Használhat kifejezettebb módszereket is, amelyeket a böngésző DOM ihletett az általános helyett válassza:

Pag elem = doc.getElementById ("pagination_control"); Elemek desktopOnly = doc.getElementsByClass ("desktopOnly");

Mivel Elem szuperosztálya Dokumentum, többet megtudhat a kiválasztási módszerekkel való munkáról a Dokumentum és Elem Javadocs.

5.2. Traversing

A bejárás a DOM-fán való navigálást jelenti. A Jsoup olyan módszereket nyújt, amelyek a Dokumentum, egy halmazon Elemek, vagy egy adott Elem, amely lehetővé teszi, hogy navigáljon egy csomópont szüleihez, testvéreihez vagy gyermekeihez.

Ugrálhat az elsőre, az utolsóra és az n-re is (0-alapú index használatával) Elem készletben Elemek:

Elem firstSection = szakaszok.első (); Elem lastSection = szakaszok.utolsó (); Elem secondSection = szakaszok.get (2); Elemek allParents = firstSection.parents (); Elem szülő = firstSection.parent (); Elemek gyermekek = firstSection.children (); Elemek testvérek = firstSection.siblingElements ();

A kiválasztásokon keresztül is iterálhat. Valójában bármi típusú Elemek iterálható:

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

Kiválaszthatja egy korábbi kiválasztást (alválasztás):

Elemek szakasz Paraméterek = firstSection.select (". Bekezdés");

6. Kivonás

Most már tudjuk, hogyan lehet elérni bizonyos elemeket, ezért itt az ideje megszerezni a tartalmukat - nevezetesen az attribútumaikat, a HTML-t vagy a gyermekszöveget.

Vessen egy pillantást erre a példára, amely kiválasztja az első cikket a blogból, és megkapja a dátumot, az első szakasz szövegét, végül a belső és külső HTML-t:

Első cikkArticle = doc.select ("cikk"). Első (); Elem timeElement = firstArticle.select ("idő"). First (); String dateTimeOfFirstArticle = timeElement.attr ("datetime"); Elem szakaszDiv = firstArticle.select ("div szakasz"). First (); Karakterlánc sectionDivText = sectionDiv.text (); Karakterlánc cikkHtml = firstArticle.html (); String externalHtml = firstArticle.outerHtml ();

Íme néhány tipp, amelyet szem előtt kell tartani a választók kiválasztásakor és használatakor:

  • Támaszkodjon a böngésző „Forrás megtekintése” szolgáltatására, és ne csak a DOM oldalra, mert az megváltozhatott (ha a böngésző konzolján választja, akkor más eredményeket hozhat, mint a jsoup).
  • Ismerje meg választóit, mivel sokan vannak, és mindig jó, ha legalább látta őket korábban; a választók elsajátítása időbe telik
  • Használjon játszóteret a kiválasztók számára, hogy kísérletezzen velük (illesszen be egy HTML mintát)
  • Legyen kevésbé függő az oldalváltásoktól: törekedjen a legkisebb és legkevésbé kompromittáló választókra (pl. Inkább az id. Alapú)

7. Módosító

A módosítás magában foglalja az elemek attribútumainak, szövegének és HTML-jének beállítását, valamint az elemek hozzáfűzését és eltávolítását. A jsoup által korábban létrehozott DOM fára - a Dokumentum.

7.1. Attribútumok és belső szöveg / HTML beállítása

A jQuery-hez hasonlóan az attribútumok, a szöveg és a HTML beállításának módszerei ugyanazokat a neveket viselik, de megkapják a beállítandó értéket is:

  • attr () - beállítja az attribútum értékeit (létrehozza az attribútumot, ha nem létezik)
  • szöveg() - beállítja az elem belső szövegét, helyettesítve a tartalmat
  • html () - beállítja az elem belső HTML-jét, helyettesítve a tartalmat

Nézzünk meg egy gyors példát ezekre a módszerekre:

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

7.2. Elemek létrehozása és hozzáfűzése

Új elem hozzáadásához előbb fel kell építenie a példányosítással Elem. Egyszer a Elem megépült, hozzáfűzheti egy másikhoz Elem használni a appendChild módszer. Az újonnan létrehozott és csatolt Elem kerül beillesztésre az elem végébe, ahol appendChild nak, nek hívják:

Element link = new Element (Tag.valueOf ("a"), "") .text ("Nézze meg ezt a csodálatos weboldalt!") .Attr ("href", "//baeldung.com") .attr ("target" , "_üres"); firstArticle.appendChild (link);

7.3. Elemek eltávolítása

Az elemek eltávolításához először ki kell választania őket, és futtatnia kell a eltávolítani módszer.

Például távolítsunk el mindent

  • címkék, amelyek anavbar-link ” osztály tól Dokumentum, és az első cikk összes képe:

    doc.select ("li.navbar-link"). eltávolít (); firstArticle.select ("img"). távolítsa el ();

    7.4. A módosított dokumentum konvertálása HTML-be

    Végül, mivel megváltoztattuk a Dokumentum, érdemes ellenőrizni a munkánkat.

    Ehhez felfedezhetjük a Dokumentum DOM fa kiválasztásával, bejárásával és kibontásával a bemutatott módszerekkel, vagy egyszerűen kivonhatjuk a HTML-jét a-ként Húr használni a html () módszer:

    Karakterlánc docHtml = doc.html ();

    A Húr a kimenet egy rendezett HTML.

    8. Következtetés

    A Jsoup nagyszerű könyvtár bármely oldal kaparására. Ha Java-t használ, és nem igényel böngészőalapú kaparást, akkor ez egy könyvtár, amelyet figyelembe kell venni. Ismerős és könnyen használható, mivel felhasználja a front-end fejlesztéssel kapcsolatos ismereteit, és követi a bevált gyakorlatokat és a tervezési mintákat.

    Ha többet szeretne megtudni a weboldalak súrolásáról a jsoup segítségével, tanulmányozza a jsoup API-t és olvassa el a jsoup szakácskönyvet.

    Az oktatóanyagban használt forráskód megtalálható a GitHub projektben.