JsoupErste Schritte mit Jsoup

Bemerkungen

Jsoup ist eine HTML-Analyse- und Datenextraktionsbibliothek für Java, die auf Flexibilität und Benutzerfreundlichkeit ausgerichtet ist. Es kann verwendet werden, um spezifische Daten aus HTML-Seiten zu extrahieren, was gemeinhin als "Web-Scraping" bezeichnet wird, sowie zum Ändern des Inhalts von HTML-Seiten und zum "sauberen" nicht vertrauenswürdigen HTML-Code mit einer Whitelist der zulässigen Tags und Attribute.

JavaScript-Unterstützung

Jsoup unterstützt kein JavaScript. Daher können dynamisch generierte Inhalte oder Inhalte, die nach dem Laden der Seite zur Seite hinzugefügt werden, nicht aus der Seite extrahiert werden. Wenn Sie Inhalte extrahieren möchten, die der Seite mit JavaScript hinzugefügt werden, gibt es einige alternative Optionen:

  • Verwenden Sie eine Bibliothek, die JavaScript unterstützt, wie z. B. Selenium, das zum Laden von Seiten einen Webbrowser verwendet, oder HtmlUnit.

  • Reverse Engineering, wie die Seite ihre Daten lädt. Normalerweise machen Webseiten, die Daten dynamisch laden, dies über AJAX. Daher können Sie auf der Registerkarte "Netzwerk" der Entwicklerwerkzeuge Ihres Browsers nachsehen, woher die Daten geladen werden, und diese URLs dann in Ihrem eigenen Code verwenden. Weitere Informationen finden Sie unter Kratzen von AJAX-Seiten .

Offizielle Website und Dokumentation

Bei Jsoup.org finden Sie verschiedene Ressourcen zu Jsoup , einschließlich Javadoc , Verwendungsbeispiele im Jsoup-Kochbuch und JAR-Downloads . Im GitHub-Repository finden Sie Quellcode, Probleme und Pull-Anforderungen.

Herunterladen

Jsoup ist auf Maven als org.jsoup.jsoup:jsoup , Wenn Sie Gradle verwenden (z. B. mit Android Studio), können Sie es zu Ihrem Projekt hinzufügen, indem Sie Folgendes zum Abschnitt build.gradle Abhängigkeiten hinzufügen:

compile 'org.jsoup:jsoup:1.8.3'

Wenn Sie Ant (Eclipse) verwenden, fügen Sie dem Abschnitt mit den POM-Abhängigkeiten Folgendes hinzu:

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

Jsoup ist auch als herunterladbare JAR für andere Umgebungen verfügbar.

Versionen

Ausführung Veröffentlichungsdatum
1.9.2 2016-05-17
1.8.3 2015-08-02

Mit Jsoup können Sie auf einfache Weise alle Links von einer Webseite extrahieren. In diesem Fall können Sie Jsoup verwenden, um nur bestimmte Links zu extrahieren, die hier in einem h3 Header auf einer Seite angezeigt werden sollen. Wir können auch den Text der Links erhalten.

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();
}

Dies ergibt die folgende Ausgabe:

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?

[...]

Was passiert hier:

  • Zuerst erhalten wir das HTML-Dokument von der angegebenen URL. Dieser Code setzt auch den User Agent-Header der Anforderung auf "Mozilla", sodass die Website die Seite bereitstellt, die sie normalerweise für Browser bereitstellt.

  • Verwenden Sie dann select(...) und eine for-Schleife, um alle Links zu Stack Overflow-Fragen zu erhalten, in diesem Fall Links, die den Klassenfrage question-hyperlink .

  • Drucken Sie den Text jedes Links mit .text() und den Link des Links mit attr("abs:href") . In diesem Fall verwenden wir abs: um die absolute URL zu erhalten, dh. mit der Domäne und dem Protokoll enthalten.

Vollständige URL aus teilweise HTML extrahieren

Wenn Sie nur den Attributwert eines Links auswählen: href gibt die relative URL zurück.

   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);

Ausgabe

/documentation

Durch das Bestehen des Basis - URI in die parse - Methode und unter Verwendung der absUrl Methode anstelle von attr , können wir die vollständige URL extrahieren.

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

Ausgabe

http://stackoverflow.com/documentation

Extrahieren Sie die Daten aus der HTML-Dokumentdatei

Mit Jsoup können Sie Daten aus einer lokalen Datei , die HTML enthält, bearbeiten oder extrahieren. filePath ist der Pfad einer Datei auf der Festplatte. ENCODING ist der gewünschte Zeichensatzname, z. B. "Windows-31J". Es ist optional.

 // 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");