Verwenden Sie Java Jsoup Parsing HTML

1- What is 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- 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
Tạo project JsoupTutorial:
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
Method Description
static Connection connect(String url) create and returns connection of URL.
static Document parse(File in, String charsetName) parses the specified charset file into document.
static Document parse(File in, String charsetName, String baseUri) parses the specified charset and baseUri file into Document.
static Document parse(String html) parses the given html code into document.
static Document parse(String html, String baseUri) parses the given html code with baseUri into Document.
static Document parse(URL url, int timeoutMillis) parses the given URL into Document.
static String clean(String bodyHtml, Whitelist whitelist) returns safe HTML from input HTML, by parsing input HTML and filtering it through a white-list of permitted tags and attributes.
  • Document.java
Methods Description
Element body()
Accessor to the document's body element.
Charset charset()
Returns the charset used in this document.
void charset(Charset charset)
Sets the charset used in this document.
Document clone()
Create a stand-alone, deep copy of this node, and all of its children.
Element createElement(String tagName)
Create a new Element, with this document's base uri.
static Document createShell(String baseUri)
Create a valid, empty shell of a document, suitable for adding more elements to.
Element head()
Accessor to the document's head element.
String location()
Get the URL this Document was parsed from.
String nodeName()
Get the node name of this node.
Document normalise()
Normalise the document.
String outerHtml()
Get the outer HTML of this node.
Document.OutputSettings outputSettings()
Get the document's current output settings.
Document outputSettings(Document.OutputSettings outputSettings)
Set the document's output settings.
Document.QuirksMode quirksMode()  
Document quirksMode(Document.QuirksMode quirksMode)   
Element text(String text)
Set the text of the body of this document.
String title()
Get the string contents of the document's title element.
void title(String title)
Set the document's title element.
boolean updateMetaCharsetElement()
Returns whether the element with charset information in this document is updated on changes through Document.charset(Charset) or not.
void updateMetaCharsetElement(boolean update)
Sets whether the element with charset information in this document is updated on changes through Document.charset(Charset) or not.
  • Element.java

5- Manipulieren von Document

5.1- Document erstellen von 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- Document erstellen von 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- Document erstellen von 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- Parsing HTML Fragment

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- DOM-Methoden

Jsoup hat einige Methode, die so ähnlich wie die Methode in das DOM Modell sein. (ein Modell zur Analyse von XML Dokument)
Methods Description
Element getElementById(String id) Find an element by ID, including or under this element.
Elements getElementsByTag(String tag) Finds elements, including and recursively under this element, with the specified tag name.
Elements getElementsByClass(String className) Find elements that have this class, including or under this element.
Elements getElementsByAttribute(String key) Find elements that have a named attribute set. Case insensitive.
Elements siblingElements() Get sibling elements.
Element firstElementSibling() Gets the first element sibling of this element.
Element lastElementSibling() Gets the last element sibling of this element.
  ......
Einige Methode zur Einnahme von Daten auf Element
Method Description
String attr(String key) Get an attribute's value by its key.
void attr(String key, String value) Set an attribute. If the attribute already exists, it is replaced.
String id() Return The id attribute, if present, or an empty string if not.
String className() Gets the literal value of this element's "class" attribute, which may include multiple class names, space separated. (E.g. on <div class="header gray"> returns, " header gray")
Set<String> classNames() Get all of the element's class names. E.g. on element <div class="header gray">, returns a set of two elements "header", "gray". Note that modifications to this set are not pushed to the backing class attribute; use the classNames(java.util.Set) method to persist them.
String text() Gets the combined text of this element and all its children.
void text(String value) Set the text of this element.
String html() Retrieves the element's inner HTML. E.g. on a <div><p>a</p></div>, would return <p>a</p>. (Whereas Node.outerHtml() would return <div><p>a</p></div>.)
void html(String value) Set this element's inner HTML. Clears the existing HTML first.
Tag tag() Get the Tag for this element
String tagName() Get the name of the tag for this element. E.g. div
  ......
Die Methode benutzen HTML
Methods Description
Element append(String html) Add inner HTML to this element. The supplied HTML will be parsed, and each node appended to the end of the children.
Element prepend(String html) Add inner HTML into this element. The supplied HTML will be parsed, and each node prepended to the start of the element's children.
Element appendText(String text) Create and append a new TextNode to this element.
Element prependText(String text) Create and prepend a new TextNode to this element.
Element appendElement(String tagName) Create a new element by tag name, and add it as the last child.
Element prependElement(String tagName) Create a new element by tag name, and add it as the first child.
Element html(String value) Set this element's inner HTML. Clears the existing HTML first.
  ......
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);
       }
   }

}
Running example:

7- Die Methoden ähnlich 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 Mô tả
tagname Tìm kiếm các phần tử theo tên thẻ. Ví dụ: a
ns|tag Tìm kiếm các phần tử theo tên thẻ trong một không gian tên (namespace), ví dụ fb|name nghĩa là tìm các phần tử <fb:name>
#id Tìm kiếm phần tử theo ID, ví dụ #logo
.class: Tìm kiếm các phần tử theo tên class, ví dụ .masthead
[attribute] Các phần tử với thuộc tính, ví dụ [href]
[^attr] Các phần tử với thuộc tính bắt đầu bởi, ví dụ [^data-] tìm kiếm các phần tử với thuộc tính bắt đầu bởi data-
[attr=value] Các phần tử với giá trị thuộc tính, ví dụ [width=500] (Cũng có thể sử dụng dấu nháy kép)
[attr^=value], [attr$=value], [attr*=value] Các phần tử với giá trị thuộc tính bắt đầu, kết thúc bởi, hoặc chứa giá trị, ví dụ [href*=/path/]
[attr~=regex] Các phần tử với giá trị khớp với biểu thức chính quy, ví dụ img[src~=(?i)\.(png|jpe?g)]
* Tất cả các phần tử, ví dụ *

der verbindende Selector

Selector Mô tả
el#id Phần tử với ID, ví dụ div#logo
el.class Các phần tử với class, ví dụ div.masthead
el[attr] Các phần tử với thuộc tính, ví dụ a[href]
Kết hợp bất kỳ ví dụ a[href].highlight
ancestor child (Phần tử tổ tiên- và hậu duệ) Các phần tử hậu duệ của một phần tử, ví dụ. .body p tìm kiếm các phần tử p bất kỳ làfinds p elements anywhere under a block with class "body"
parent > child Các phần tử con trực tiếp của phần tử cha, ví dụ div.content > p tìm kiếm các phần tử p là con trực tiếp của div có class ='content'; và body > * tìm kiếm các phần tử con trực tiếp của thẻ body
siblingA + siblingB Tìm kiếm phần tử anh em B ngay phía trước của phần tử A, ví dụ div.head + div
siblingA ~ siblingX Tìm kiếm các phần tử anh em X trước phần tử A, ví dụ h1 ~ p
el, el, el Nhóm nhiều Selector, tìm kiếm các phần tử khớp với một trong những Selector; ví dụ div.masthead, div.logo

Pseudo selectors

Selector Mô tả
:lt(n) Tìm kiếm các phần tử có chỉ số anh em (vị trí trong cây DOM quan hệ với phần tử cha của nó) nhỏ hơn n; ví dụ td:lt(3)
:gt(n) Tìm kiếm các phần tử có chỉ số anh em lớn hơn n, ví dụ div p:gt(2)
:eq(n) find elements whose sibling index is equal to n; e.g. form input:eq(1)
:has(seletor) Tìm kiếm các phần tử chứa các phần tử khớp với selector; ví dụ div:has(p)
:not(selector) Tìm kiếm các phần tử không khớp với selector; ví dụ div:not(.logo)
:contains(text) Tìm kiếm các phần tử chứa đoạn text đã cho. Tìm kiếm không phân biệt chữ hoa chữ thường; ví dụ p:contains(jsoup)
:containsOwn(text) Tìm kiếm các phần tử trực tiếp chứa đoạn text đã cho
:matches(regex) Tìm kiếm các phần tử mà text khớp với biểu thức chính quy chỉ định; ví dụ div:matches((?i)login)
:matchesOwn(regex) Tìm kiếm các phần tử mà text của nó khớp với biểu thức chính quy chỉ định.
Chú ý: Cách đánh chỉ số pseudo bắt đầu từ 0, phần tử đầu tiên có chỉ số 0, phần tử thứ 2 có chỉ số 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