JsoupAan de slag met Jsoup


Opmerkingen

Jsoup is een HTML-parsing- en data-extractiebibliotheek voor Java, gericht op flexibiliteit en gebruiksgemak. Het kan worden gebruikt om afzonderlijke gegevens uit HTML-pagina's te extraheren, ook wel 'web scraping' genoemd, en om de inhoud van HTML-pagina's te wijzigen en niet-vertrouwde HTML 'schoon' te maken met een witte lijst van toegestane tags en attributen.

JavaScript-ondersteuning

Jsoup ondersteunt geen JavaScript en daarom kan dynamisch gegenereerde inhoud of inhoud die aan de pagina wordt toegevoegd na het laden van de pagina niet uit de pagina worden geëxtraheerd. Als u extract inhoud die wordt toegevoegd aan de pagina met JavaScript, zijn er een aantal alternatieve opties:

  • Gebruik een bibliotheek die JavaScript ondersteunt, zoals Selenium, die een echte webbrowser gebruikt om pagina's te laden, of HtmlUnit.

  • Reverse-engineer hoe de pagina zijn gegevens laadt. Webpagina's die gegevens dynamisch laden, doen dit meestal via AJAX, en dus kunt u op het netwerktabblad van de ontwikkeltools van uw browser kijken om te zien waar de gegevens worden geladen en die URL's vervolgens in uw eigen code gebruiken. Zie hoe u AJAX-pagina's kunt schrapen voor meer informatie.

Officiële website & documentatie

U kunt verschillende aan Jsoup gerelateerde bronnen vinden op jsoup.org , waaronder Javadoc , gebruiksvoorbeelden in het Jsoup-kookboek en JAR-downloads . Zie de GitHub-repository voor de broncode, problemen en pull-aanvragen.

Download

Jsoup is beschikbaar op Maven als org.jsoup.jsoup:jsoup , als u org.jsoup.jsoup:jsoup gebruikt (bijv. Met Android Studio), kunt u het toevoegen aan uw project door het volgende toe te voegen aan uw build.gradle afhankelijkheden:

compile 'org.jsoup:jsoup:1.8.3'

Als u Ant (Eclipse) gebruikt, voegt u het volgende toe aan uw POMs-afhankelijkheden:

<dependency>
  <!-- jsoup HTML parser library @ http://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.8.3</version>
</dependency>

Jsoup is ook beschikbaar als downloadbare JAR voor andere omgevingen.

versies

Versie Publicatiedatum
1.9.2 2016/05/17
1.8.3 2015/08/02

Extraheer volledige URL uit gedeeltelijke HTML

Als u alleen de kenmerkwaarde van een link: href selecteert, wordt de relatieve URL geretourneerd.

   String bodyFragment = 
          "<div><a href=\"/documentation\">Stack Overflow Documentation</a></div>";


    Document doc = Jsoup.parseBodyFragment(bodyFragment);
    String link = doc
            .select("div > a")
            .first()
            .attr("href");
    
    System.out.println(link);
 

uitgang

/documentation
 

Door de basis-URI door te geven aan de parse methode en de absUrl methode te gebruiken in plaats van attr , kunnen we de volledige URL extraheren.

    Document doc = Jsoup.parseBodyFragment(bodyFragment, "http://stackoverflow.com");
    
    String link = doc
                .select("div > a")
                .first()
                .absUrl("href");
    
    System.out.println(link);
 

uitgang

http://stackoverflow.com/documentation
 

Pak de gegevens uit het HTML-documentbestand

Jsoup kan worden gebruikt om gegevens te manipuleren of te extraheren uit een lokaal bestand dat HTML bevat. filePath is het pad van een bestand op schijf. ENCODING is de gewenste tekensetnaam, bijvoorbeeld "Windows-31J". Het is optioneel.

 // load file
    File inputFile = new File(filePath);
    // parse file as HTML document
    Document doc = Jsoup.parse(filePath, ENCODING);
    // select element by <a> 
    Elements elements = doc.select("a");
 

Jsoup kan worden gebruikt om eenvoudig alle links van een webpagina te extraheren. In dit geval kunnen we Jsoup gebruiken om alleen specifieke links te extraheren die we willen, hier, in een h3 header op een pagina. We kunnen ook de tekst van de links ophalen.

Document doc = Jsoup.connect("http://stackoverflow.com").userAgent("Mozilla").get();
for (Element e: doc.select("a.question-hyperlink")) {
    System.out.println(e.attr("abs:href"));
    System.out.println(e.text());
    System.out.println();
}
 

Dit geeft de volgende output:

http://stackoverflow.com/questions/12920296/past-5-week-calculation-in-webi-bo-4-0
Past 5 week calculation in WEBI (BO 4.0)?

http://stackoverflow.com/questions/36303701/how-to-get-information-about-the-visualized-elements-in-listview
How to get information about the visualized elements in listview?

[...]
 

Wat gebeurt er hier:

  • Eerst krijgen we het HTML-document van de opgegeven URL. Deze code stelt ook de header van de User Agent van het verzoek in op "Mozilla", zodat de website de pagina weergeeft die deze gewoonlijk aan browsers zou tonen.

  • Gebruik vervolgens select(...) en een for-lus om alle koppelingen naar Stack Overflow-vragen te krijgen, in dit geval koppelingen met de klasse question-hyperlink .

  • Druk de tekst van elke link af met .text() en de href van de link met attr("abs:href") . In dit geval gebruiken we abs: om de absolute URL te krijgen, dwz. inclusief het domein en het protocol.