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.