1. 程式人生 > >Jsoup中文api內容簡單整理

Jsoup中文api內容簡單整理

Jsoup

1.解析一個文件:

文件由多個Elements和TextNodes組成 (以及其它輔助nodes)

java.lang.Object

  • org.jsoup.nodes. (implements java.lang., java.util.<K,V>)
  • org.jsoup.nodes. (implements java.lang., java.lang.<T>)
  • org.jsoup.nodes.
  • org.jsoup.nodes.Node (implements java.lang.)
    • org.jsoup.nodes.
    • org.jsoup.nodes.
    • org.jsoup.nodes.

Node: 基礎,抽象節點模型。 元素,文件,註釋等都是Node例項。

Element: HTML元素由標籤名稱,屬性和子節點(包括文字節點和其他元素)組成。 從元素中,您可以提取資料,遍歷節點圖並操作HTML

Jsoup:jsoup功能的核心公共接入點。

parse方法:

staticDocument   parse(Stringhtml)

          Parse HTML into a Document.

這方法能夠將輸入的HTML解析為一個新的文件 (Document)

只要解析的不是空字串,就能返回一個結構合理的文件,其中包含(至少) 一個head和一個body元素。一旦擁有了一個Document

,你就可以使用Document中適當的方法或它父類 Element和Node中的方法來取得相關資料。

解析一個html文件:

Stringhtml = "<html><head><title>Firstparse</title></head>"

  + "<body><p>Parsed HTML intoa doc.</p></body></html>";

// 其解析器能夠盡最大可能從你提供的HTML文件來創見一個乾淨的解析結果,無論HTML//式是否完整

Document doc = Jsoup.parse(html);

解析一個body片段:

Stringhtml = "<div><p>Lorem ipsum.</p>";

Document doc = Jsoup.parseBodyFragment(html);

Elementbody = doc.body();

parseBodyFragment 方法建立一個空殼的文件,並插入解析過的HTML到body元素中。假如你使用正常的 Jsoup.parse(String html) 方法,通常你也可以得到相同的結果,但是明確將使用者輸入作為 body片段處理,以確保使用者所提供的任何糟糕的HTML都將被解析成body元素。

Document.body() 方法能夠取得文件body元素的所有子元素,與 doc.getElementsByTag("body")相同。

從一個URL載入一個Document:

static Connection   connect(Stringurl)

    建立一個到URL的新連線。 用於獲取和解析HTML頁面。可能會有IOException

Document get()

   以GET方式執行請求,並解析結果。

String  title()

獲取文件標題元素的字串內容。

Connection  data(Stringkey, String value)

新增請求資料引數。 請求引數在GET的請求查詢字串中傳送,在POST的請求正文中傳送。 一個請求可能有多個相同名稱的值。

Connection  userAgent(StringuserAgent)

設定請求使用者代理標題。

Connection  cookie(Stringname, String value)

設定要在請求中傳送的Cookie

Connection  timeout(int millis)

設定請求超時(連線和讀取)

 Connection介面還提供一個方法鏈來解決特殊請求:

Document doc =Jsoup.connect("http://example.com")

  .data("query", "Java")

  .userAgent("Mozilla")

  .cookie("auth", "token")

  .timeout(3000)

  .post();

從檔案載入一個文件:

static Document parse(InputStream in, String charsetName, StringbaseUri)

          方法用來載入和解析一個HTML檔案baseUri 引數用於解決檔案中URLs是相對路徑的問題。如果不需要可以傳入一個空的字串。

File input = new File("/tmp/input.html");

Document doc =Jsoup.parse(input, "UTF-8", "http://example.com/");

使用DOM方法來遍歷一個文件:

File input = newFile("/tmp/input.html");

Document doc =Jsoup.parse(input, "UTF-8", "http://example.com/");//通過本地讀取文件。

Element content = doc.getElementById("content");//通過id獲取元素

Elements links =content.getElementsByTag("a");//通過標籤獲取元素

for (Element link : links) {

  String linkHref =link.attr("href");//通過屬性獲取元素

  String linkText = link.text();//獲取文件內容

}

使用選擇器查詢元素:

Elements    select(StringcssQuery)

查詢與選擇器CSS查詢匹配的元素,並將此元素作為起始上下文。匹配的元素可能包含此元素或其任何子元素。

Select選擇器用法:

tagname: 通過標籤查詢元素,比如:a

ns|tag: 通過標籤在名稱空間查詢元素,比如:可以用 fb|name 語法來查詢 <fb:name> 元素

#id: 通過ID查詢元素,比如:#logo

.class: 通過class名稱查詢元素,比如:.masthead

[attribute]: 利用屬性查詢元素,比如:[href]

[^attr]: 利用屬性名字首來查詢元素,比如:可以用[^data-] 來查詢帶有HTML5 Dataset屬性的元素

[attr=value]: 利用屬性值來查詢元素,比如:[width=500]

[attr^=value], [attr$=value], [attr*=value]: 利用匹配屬性值開頭、結尾或包含屬性值來查詢元素,比如:[href*=/path/]

[attr~=regex]: 利用屬性值匹配正則表示式來查詢元素,比如:img[src~=(?i)\.(png|jpe?g)]

*: 這個符號將匹配所有元素

2、Selector選擇器組合使用語法

el#id: 元素+ID,比如: div#logo

el.class: 元素+class,比如:div.masthead

el[attr]: 元素+class,比如: a[href]

任意組合,比如:a[href].highlight

ancestor child: 查詢某個元素下子元素,比如:可以用.body p 查詢在”body”元素下的所有 p元素

parent > child: 查詢某個父元素下的直接子元素,比如:可以用div.content > p 查詢 p 元素,也可以用body > * 查詢body標籤下所有直接子元素

siblingA + siblingB: 查詢在A元素之前第一個同級元素B,比如:div.head + div

siblingA ~ siblingX: 查詢A元素之前的同級X元素,比如:h1 ~ p

el, el, el:多個選擇器組合,查詢匹配任一選擇器的唯一元素,例如:div.masthead,div.logo

描述

測試的HTML程式碼

select寫法

結果

通過標籤名查詢

<span>33</span>

<span>25</span>

Elements elements = doc.select("span");

:通過標籤來查詢,直接寫 "標籤名就好,不需要尖括號

33

25

通過 id 查詢

<span id="mySpan">36</span>

<span>20</span>

Elements elements = doc.select("#mySpan");

:通過id來查詢,用 #

通過 class查詢

<span class="myClass">36</span>

<span>20</span>

Elements elements = doc.select(".myClass");

:通過class來查詢,用 .

通過屬性名查詢

<span class="class1" id="id1">36</span>

<span class="class2" id="id2">36</span>

Elements elements = doc.select("span[class=class1]span[id=id1]");

:查詢規則為標籤名[屬性名=屬性值]

標籤名可寫可不寫,多個屬性即多個[],如上

通過屬性名字首查詢

<span class="class1">36</span>

<span class="class2">22</span>

Elements elements = doc.select("span[^cl]");

:查詢規則為標籤名[^屬性名字首

標籤名可寫可不寫,多個屬性即多個[]

36

22

通過屬性名+正則表示式查詢

<span class="ABC">36</span>

<span class="ADE">22</span>

Elements elements = doc.select("span[class~=^AB]");

:查詢規則為標籤名[屬性名~=正則表示式]

標籤名可寫可不寫,多個屬性即多個[]

通過文字內容查詢

<span>36</span>

<span>22</span>

Elements elements = doc.select("span:contains(3)");

:查詢規則為標籤名:contains(文字值)

通過文字內容+正則表示式查詢

<span>36</span>

<span>22</span>

Elements elements = doc.select("span:matchesOwn(^3)");

:查詢規則為標籤名:matchesOwn(正則表示式)

3、Selector偽選擇器語法

:lt(n): 查詢哪些元素的同級索引值(它的位置在DOM樹中是相對於它的父節點)小於n,比如:td:lt(3) 表示小於三列的元素

:gt(n):查詢哪些元素的同級索引值大於n,比如:div p:gt(2)表示哪些div中有包含2個以上的p元素

:eq(n): 查詢哪些元素的同級索引值與n相等,比如:forminput:eq(1)表示包含一個input標籤的Form元素

:has(seletor): 查詢匹配選擇器包含元素的元素,比如:div:has(p)表示哪些div包含了p元素

:not(selector): 查詢與選擇器不匹配的元素,比如: div:not(.logo) 表示不包含 class=logo 元素的所有 div 列表

:contains(text): 查詢包含給定文字的元素,搜尋不區分大不寫,比如: p:contains(jsoup)

:containsOwn(text): 查詢直接包含給定文字的元素

:matches(regex): 查詢哪些元素的文字匹配指定的正則表示式,比如:div:matches((?i)login)

:matchesOwn(regex): 查詢自身包含文字匹配指定正則表示式的元素

注意:上述偽選擇器索引是從0開始的,也就是說第一個元素索引值為0,第二個元素index為1等。

從元素抽取屬性,文字和HTML:

要取得一個屬性的值,可以使用Node.attr(String key) 方法

對於一個元素中的文字,可以使用Element.text()方法

對於要取得元素或屬性中的HTML內容,可以使用Element.html(), 或 Node.outerHtml()方法

String html ="<p>An <ahref='http://example.com/'><b>example</b></a>link.</p>";

Document doc =Jsoup.parse(html);//解析HTML字串返回一個Document實現

Element link =doc.select("a").first();//查詢第一個a元素

String text =doc.body().text(); // "An example link"//取得字串中的文字

String linkHref = link.attr("href");// "http://example.com/"//取得連結地址

String linkText = link.text();// "example""//取得連結地址中的文字

String linkOuterH =link.outerHtml();

    // "<ahref="http://example.com"><b>example</b></a>"

String linkInnerH =link.html(); // "<b>example</b>"//取得連結內的html內容

處理URLS

你有一個包含相對URLs路徑的HTML文件,需要將這些相對路徑轉換成絕對路徑的URLs。

Document doc =Jsoup.connect("http://www.open-open.com").get();

Element link =doc.select("a").first();

String relHref =link.attr("href"); // == "/"

String absHref =link.attr("abs:href"); // http://www.open-open.com/

在HTML元素中,URLs經常寫成相對於文件位置的相對路徑: <a href="/download">...</a>. 當你使用 Node.attr(String key) 方法來取得a元素的href屬性時,它將直接返回在HTML原始碼中指定定的值。

假如你需要取得一個絕對路徑,需要在屬性名前加 abs: 字首。這樣就可以返回包含根路徑的URL地址attr("abs:href")

因此,在解析HTML文件時,定義base URI非常重要。

如果你不想使用abs: 字首,還有一個方法能夠實現同樣的功能 Node.absUrl(Stringkey)。