Verwenden Sie Java Jsoup Parsing HTML

1- Was ist Jsoup?

Jsoup ist  Java HTML Parser. In anderen Worten, Jsoup ist eine Bibliothek zur Analyse des HTML Dokument. Jsoup bietet die API zur Aufnahme der Daten und Daten- Bearbeitung aus URL oder aus der Datei HTML an. Es benutzt die Methode wie DOM, CSS , JQuery um die Daten aufzunehmen und bearbeiten.
Sehen Sie bitte ein Beispiel mit Jsoup:
HelloJsoup.java
import java.io.IOException;  
import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;

public class HelloJsoup {  

   public static void main( String[] args ) throws IOException{  
       Document doc = Jsoup.connect("http://eclipse.org").get();  
       String title = doc.title();  
       System.out.println("Title : " + title);  
   }  

}

2- Die Jsoup Bibliothek

Sie können Maven benutzen oder die Bibliothek Jsoup mit der Format von File Jar herunterladen
Mit Maven
<!-- http://mvnrepository.com/artifact/org.jsoup/jsoup -->

<dependency>
   <groupId>org.jsoup</groupId>
   <artifactId>jsoup</artifactId>
   <version>1.8.3</version>
</dependency>
Oder Sie können herunterladen

3- Maven-Projekt erstellen

OK, wir erstellen schnell ein Maven Projekt um die Beispiele überzuprüfen
Das Projekt  JsoupTutorial erstellen:
Wandeln Sie es zum Maven Projekt um. Klicken Sie die Rechtsmaustaste auf das Projekt und wählen Sie
  • Configure/Convert to Maven Project
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.o7planning</groupId>
   <artifactId>JsoupTutorial</artifactId>
   <version>0.0.1-SNAPSHOT</version>

   <dependencies>

       <!-- http://mvnrepository.com/artifact/org.jsoup/jsoup -->
       <dependency>
           <groupId>org.jsoup</groupId>
           <artifactId>jsoup</artifactId>
           <version>1.8.3</version>
       </dependency>

   </dependencies>

   <build>
       <sourceDirectory>src</sourceDirectory>
       <plugins>
           <plugin>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>3.3</version>
               <configuration>
                   <source>1.8</source>
                   <target>1.8</target>
               </configuration>
           </plugin>
       </plugins>
   </build>
</project>

4- Jsoup API

Jsoup schließt viele Klasse ein, aber es gibt 3 wichtigste Klasse. Das sind
  • org.jsoup.Jsoup
  • org.jsoup.nodes.Document
  • org.jsoup.nodes.Element
     
  • Jsoup.java
Die Methode Die Bezeichnung
static Connection connect(String url) Das Objekt Connection verbindent mit URL erstellen und zurückgeben
static Document parse(File in, String charsetName) Eine File HTML mit charset annalysieren.
static Document parse(File in, String charsetName, String baseUri) Die File HTML mit charset,und baseUri annalysieren
static Document parse(String html) Die Kode HTML annalysieren und das Objekt Document zurückgeben.
static Document parse(String html, String baseUri) Die Kode HTML mit baseUri zum Objekt Document annalysieren
static Document parse(URL url, int timeoutMillis) Eine URL zum Document annalysieren
static String clean(String bodyHtml, Whitelist whitelist) Die sichere HTML aus der Input-HTML zurückgeben, indem die Input-HTML wird annalysiert und durch eine Weißliste (whitelist) des Tags und der erlaubten Attribute gefiltert
  • Document.java
Die Methode Die Bezeichnung
Element body()
In den Element body vom HTML Dokument zugreifen
Charset charset()
charset zurückgeben, das im Unterlagen benutzt wird
void charset(Charset charset)
charset wird im Unterlagen benutzt.
Document clone()
Eine Copy Version des Unterlagen erstellen, umfassend die Sub Node kopieren
Element createElement(String tagName)
Ein Element erstellen
static Document createShell(String baseUri)
Ein leeres Unterlagen erstellen ( Document) um die Element darin einzufügen
Element head()
In den Element head zugreifen
String location()
URL des Dokument zurückgeben
String nodeName()
Die Node des Name dieser Node zurückgeben
Document normalise()
Normalise the document.
String outerHtml()
Outer HTML dieser  node zurückgeben
Document.OutputSettings outputSettings()
Das Objekt als die Inputeinstellungen des Dokument zurückgeben
Document outputSettings(Document.OutputSettings outputSettings)
Das Output des Dokument einstellen.
Document.QuirksMode quirksMode()  
Document quirksMode(Document.QuirksMode quirksMode)   
Element text(String text)
Die Inhalt der Text vom body des Dokument einstellen
String title()
Den Titel des Dokument zurückgeben
void title(String title)
Den Titel des Dokument setzen
boolean updateMetaCharsetElement()
Es ist true wenn der Element (element) mit der Information charset im Dokument durch die Methode   Document.charset(Charset) geändert.
void updateMetaCharsetElement(boolean update)
Ja oder nein einstellen. Der Element mit der Information charset werden durch die Methode Document.charset(Charset) aktualisiert.
  • Element.java

5- Die Manipulation mit dem Document

5.1- Die Erstellung von Document aus URL

GetDocumentFromURL.java
package org.o7planning.tutorial.jsoup.document;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class GetDocumentFromURL {

  public static void main(String[] args) throws IOException {
      Document doc = Jsoup.connect("http://eclipse.org").get();
      String title = doc.title();
      System.out.println("Title : " + title);
  }

}
Das Beispiel starten

5.2- Die Erstellung vom Dokument aus der File

GetDocumentFromFile.java
package org.o7planning.tutorial.jsoup.document;

import java.io.File;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class GetDocumentFromFile {

   public static void main(String[] args) throws IOException {
       File htmlFile = new File("C:/index.html");
       Document doc = Jsoup.parse(htmlFile, "UTF-8");
       String title = doc.title();
       System.out.println("Title : " + title);
   }

}

5.3- Die Erstellung vom Dokument aus String

GetDocumentFromString.java
package org.o7planning.tutorial.jsoup.document;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class GetDocumentFromString {

  public static void main(String[] args) throws IOException {
      String htmlString = "<html><head><title>Simple Page</title></head>"
                         + "<body>Hello</body></html>";
      Document doc = Jsoup.parse(htmlString);
      String title = doc.title();
      System.out.println("Title : " + title);
      System.out.println("Content:\n");
      System.out.println(doc.toString());
  }

}
Das Beispiel starten

5.4-  HTML Fragment analysieren

Ein genügendes Dokument HTML schließt Header und Body ein, manchmals brauchen Sie einen Stück von HTML analysieren. Und Sie können ein Dokument HTML mit header und body einnehmen. Bitte sehen Sie ein Beispiel
ParsingBodyFragment.java
package org.o7planning.tutorial.jsoup.document;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class ParsingBodyFragment {

  public static void main(String[] args) throws IOException {
      String htmlFragment = "<h1>Hi you!</h1><p>What is this?</p>";
      Document doc = Jsoup.parseBodyFragment(htmlFragment);
      String fullHtml = doc.html();
      System.out.println(fullHtml);
  }

}
Ein Beispeil starten

6- Die DOM-Methoden

Jsoup hat einige Methode, die so ähnlich wie die Methode in das DOM Modell sein. (ein Modell zur Analyse von XML Dokument)
Die Methode Die Bezeichnung
Element getElementById(String id) Ein Element durch ID finden, einschließend oder unter des Element.
Elements getElementsByTag(String tag) Die Elemente finden, einschließend und die Rekursion unter des Element mit den bestimmten Namentag
Elements getElementsByClass(String className) Ein Element finden, das className durch den Parameter hat, einschließend oder unter des Element
Elements getElementsByAttribute(String key) Ein Element finden, das das Attribut durch den Parameter ohne den Unterschied zwischen großen oder kleinen Buchstaben hat 
Elements siblingElements() Die Geschwester-Elemente zurückgeben
Element firstElementSibling() Das erste Geschwester-Element von diesem Element zurückgeben
Element lastElementSibling() Das letzte Geschwester-Element von diesem Element zurückgeben
  ......
Einige Methode zur Einnahme von Daten auf Element
Die Methode Die Bezeichnung
String attr(String key) Die Attributeswert durch seinen Schlüssel (key) zurückgeben
void attr(String key, String value) Die Attributeswert setzen. Wenn das Attribut existiert, wird es ersetzt.
String id() Das ID Attribut zurückgeben wenn ja oder das leere String zurückgeben wenn nicht
String className() Das Wertsstring des Attribut "class". Es kann viele Klassename haben, die durch den leeren Zeichen getrennt werden (Zum Beispiel <div class="header gray"> gibt es "header gray" zurück)
Set<String> classNames() Alle Klasse-names zurückgeben. Z.B <div class="header gray">, gibt es 2 Elemente "header" und "gray" zurück. Achten Sie, die Änderung der Kollektion macht das Attribut des Element nicht ändern. Wenn ändern möchten, benutzen Sie die Methode classNames(java.util.Set).
String text() Eine Kombinationstext von seiner Text und alle Text von der Sub-Elementen zurückgeben
void text(String value) Die Text für das Element setzen
String html() Retrieves the element's inner HTML. Z.B <div><p>a</p> , gibt es <p>a</p> zurück. (Node.outerHtml() wird <div><p>a</p></div> zurückgeben)
void html(String value) Html innerhalb des Elementes setzen. die verfügbaren HTML löschen
Tag tag() Tag für das Element zurückgeben 
String tagName() Den Tagname für das Element zurückgeben. Z.B div
  ......
Die Methode benutzen HTML
Die Methode Die Bezeichnung
Element append(String html) HTML in das Element einfügen. Die angebotene Html wird analysiert und jede Node wird am Ende von der Sub-Node des Element  angehängt
Element prepend(String html) HTML in das Element einfügen. Die angebotene Html wird analysiert,und jede Node wird vor der Sub-Node des Element angehängt
Element appendText(String text) Eine neue TextNode in das Element erstellen und anhängen
Element prependText(String text) Eine neue TextNode vor der Kollektion von Sub-Node des Element erstellen und anhängen
Element appendElement(String tagName) Ein neues Element durch TagName erstellen und als das Sub-Element am Ende anhängen
Element prependElement(String tagName) Ein neues Element durch TagName erstellen und als das erste Sub-Element anhängen
Element html(String value) HTML innerhalb des Element setzen. die verfügbaren HTML löschen
  ......
Das Beispiel bezeichnet die Benutzung der Methode DOM und die Analyse des HTML Dokument zum Aufschreiben der Information in dem Tag form.
register.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Register</title>
</head>
<body>
   <form id="registerForm" action="doRegister" method="post">
       <table>
           <tr>
               <td>User Name</td>
               <td><input type="text" name="userName" value="Tom" /></td>
           </tr>
           <tr>
               <td>Password</td>
               <td><input type="password" name="password" value="Tom001" /></td>
           </tr>
           <tr>
               <td>Email</td>
               <td><input type="email" name="email" value="theEmail@gmail.com" /></td>
           </tr>
           <tr>
               <td colspan="2"><input type="submit" name="submit" value="Submit" /></td>
           </tr>
       </table>
   </form>
</body>
</html>
ReadHtmlForm.java
package org.o7planning.tutorial.jsoup.dom;

import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class ReadHtmlForm {
   
   public static void main(String[] args) throws IOException {
       
       Document doc = Jsoup.parse(new File("files/register.html"), "utf-8");
       
       Element form = doc.getElementById("registerForm");
       
       System.out.println("Form action = "+ form.attr("action"));

       Elements inputElements = form.getElementsByTag("input");
       
       for (Element inputElement : inputElements) {
           String key = inputElement.attr("name");
           String value = inputElement.attr("value");
           
           System.out.println(key + " =  " + value);
       }
   }
   
}
Das Beispiel starten
GetAllLinks.java
package org.o7planning.tutorial.jsoup.dom;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class GetAllLinks {

   public static void main(String[] args) throws IOException {

       Document doc = Jsoup.connect("http://o7planning.org").get();

       // Elements extends ArrayList<Element>.
       Elements aElements = doc.getElementsByTag("a");

       for (Element aElement : aElements) {
           String href = aElement.attr("href");
           String text = aElement.text();
           System.out.println(text);
           System.out.println("\t" + href);
       }
   }

}
Das Beispiel starten

7- Die ähnlichen  Methoden wie jQuery, Css

Möchten Sie die Elemente, die die Syntax wie CSS oder jQuery benutzen, suchen oder einsetzen?
JSoup bietet Sie einige Methode zur Durchführung dieser Aufgaben
  • Element.select(String selector)
  • Elements.select(String selector)
Das Beispiel
Connection conn = Jsoup.connect("http://o7planning.org");
        
Document doc = conn.get();

// a with href
Elements links = doc.select("a[href]");

// img with src ending .png
Elements pngs = doc.select("img[src$=.png]");

// div with class=masthead
Element masthead = doc.select("div.masthead").first();

// direct a after h3
Elements resultLinks = doc.select("h3.r > a");
Die Elemente JSoup unterstützen Ihnen die Syntax wie CSS oder JQuery damit Sie die entsprechenden Elemente suchen. Diese Unterstützungen sind sehr stark. Die Options sind vorhanden in der Klasse von Document, Element oder  Elements.

Die Übersicht von dem Selector (der Wähler).

Selector Die Bezeichnung
tagname Die Elemente nach den Tag-name. Zum Beispiel: a
ns|tag Die Elemente nach den Tag-name in einer namespace, zum Beispiel: fb|name bedeutet die Findung nach den Elemente <fb:name>
#id Die Elemente nach ID finden, zum Beispiel #logo
.class: Die Elemente nach den Klasse-name finden ,zum Beispiel .masthead
[attribute] Die Elemente mit den Attribute, zum Beispiel [href]
[^attr] Die Elemente mit den Attribute, die mit.. beginnen , zum Beispiel [^data-] findet die Elemente mit den Attribute, die mit data-  beginnen
[attr=value] Die Elemente mit den Attribute-Wert, z.B [width=500] (kann die Anführungzeichen benutzen)
[attr^=value], [attr$=value], [attr*=value] Die Elemente mit den Attribute-Wert, die mit... beginnen, enden oder die Wert enthalten , zum Beispiel [href*=/path/]
[attr~=regex] Die Elemente, deren Wert den regularen Ausdrück entsprechen, zum Beispiel img[src~=(?i)\.(png|jpe?g)]
* Alle Elemente, zum Beispiel *

Der verbindende Selector

Selector Die Bezeichnung
el#id Die Elemente mit ID, zum Beispiel div#logo
el.class Die Elemente mit der Klasse , zum Beispiel div.masthead
el[attr] Die Elemente mit den Attribute, zum Beispiel a[href]

die irgendeine Kombination, Zum Beispiel a[href].highlight
ancestor child (Das Vorängerelement und das Nachkommenelement) die Nachkommenelemente eines Element, zum Beispiel: .body p findet irgendeine Elemente, die die Nachkommenelemente mit dem Attribut class = "body" ist
parent > child Die direkte Sub-Elemente des Vaterelement, zum Beispiel div.content > p findet die Elemente p als die direkte Sub-Elemente von div mit der Klasse class ='content'; und body > * 
siblingA + siblingB Die Geschwesterelement B gleich vor dem Element A, zum Beispiel div.head + div finden
siblingA ~ siblingX Die Geschwesterelement X vor dem Element A finden, zum Beipsiel  h1 ~ p
el, el, el Die Gruppe von mehreren Selector finden die Elemente, die den Selector entsprechen, finden. Zum Beispiel div.masthead, div.logo

Pseudo selectors

Selector Die Bezeichnung
:lt(n) Die Elemente finden, deren Geschwestersindex (Die Position im DOM Baum bezieht sich mit seiner Vater) kleiner als n ist; zum Beispiel td:lt(3)
:gt(n) Die Element finde, deren Geschwestersindex größer als n ist, zum Beispiel div p:gt(2)
:eq(n) Die Elements finden, deren Geschwestersindex so gleich wie n ist ;z.B. form input:eq(1)
:has(seletor) Die Elemente finden, deren Element dem Selector entsprechen ; z.B div:has(p)
:not(selector) Die Elemente finden, deren Element dem Selector nicht entsprechen, z.B  div:not(.logo)
:contains(text) Die Elemente finden, die die gegebene Text enthaltet. die Findung unterscheidet sich die größe und kleine Buchstabe nicht ; z.B p:contains(jsoup)
:containsOwn(text) Die Elemente finden, die die gegebene Text direkt enthaltet
:matches(regex) Die Elemente finden, deren Text dem bestimmten  regularen Ausdruck entsprechen ; z.B div:matches((?i)login)
:matchesOwn(regex) Die Elemente finden, deren eigenen Text dem bestimmten regularen Ausdruck ensprechen 
Achtung: die Index pseudo wird vom 0 makiert. Das erste Element hat die Index 0, das zweite Element hat die Index 1 ,...
QueryLinks.java
package org.o7planning.tutorial.jsoup.selector;

import java.io.IOException;
import java.util.Iterator;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class QueryLinks {

    public static void main(String[] args) throws IOException {
        Connection conn = Jsoup.connect("http://o7planning.org");
        
        Document doc = conn.get();
        
        // Query <a> elements, href contain /document/
        String cssQuery = "a[href*=/document/]";
        Elements elements=    doc.select(cssQuery);
        
        Iterator<Element> iterator = elements.iterator();
        
        while(iterator.hasNext())  {
            Element e = iterator.next();
            System.out.println(e.attr("href"));
        }
        
    }

}
Das Ergebnis zum Beispiel-Starten
document.html
<html>
<head>
 <title>Jsoup Example</title>
</head>
<body>
 <h1>Java Tutorial For Beginners</h1>
 <br>
 <div id="content">
   Content ....
 </div>

 <div class="related-container">
    <h3>Related Documents</h3>
    <a href="http://o7planning.org/web/fe/default/en/document/649342/guide-to-installing-and-configuring-eclipse">
       Guide to Installing and Configuring Eclipse
    </a>
    <a href="http://o7planning.org/web/fe/default/en/document/649326/guide-to-installing-and-configuring-java">
       Guide to Installing and Configuring Java  
    </a>
    <a href="http://o7planning.org/web/fe/default/en/document/245310/jdk-javadoc-in-chm-format">
       Jdk Javadoc in chm format
    </a>
   
 </div>

</body>
</html>
SelectorDemo1.java
package org.o7planning.tutorial.jsoup.selector;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class SelectorDemo1 {

    public static void main(String[] args) throws IOException {
        File htmlFile = new File("document.html");
        Document doc = Jsoup.parse(htmlFile, "UTF-8");

        // First <div> element has class ="related-container"
        Element div = doc.select("div.related-container").first();

        // List the <h3>, the direct child elements of the current element.
        Elements h3Elements = div.select("> h3");

        // Get first <h3> element
        Element h3 = h3Elements.first();

        System.out.println(h3.text());

        // List <a> elements, is a descendant of the current element
        Elements aElements = div.select("a");

       
        // Query the current element list.
        // The element that href contains 'installing'.
        Elements aEclipses = aElements.select("[href*=Installing]");

        Iterator<Element> iterator = aEclipses.iterator();

        while (iterator.hasNext()) {
            Element a = iterator.next();
            System.out.println("Document: "+ a.text());
        }
    }

}
Das Ergebnis zum Beispiel-Starten