Jsoup解析HTML、加載文檔等實例


一、引入jsoup的jar包:http://jsoup.org/download

  補充:http://jsoup.org/apidocs/   Jsoup API    可以了解更詳細的內容

二、Jsoup將html字符串解析成Document結構

public void testJsoupHtml(){
        String html="<table><tr><td>名稱</td><td>價格(元/本)</td><td>描述</td></tr><tr><td>《霧都的孤兒》</td><td>33.4</td><td>敘述霧都的孤兒</td></tr></table>";
        Document doc = Jsoup.parse(html);
        System.out.println(doc.childNodeSize());
    }

Jsoup.parse(String str)說明:該解析器能夠盡最大可能從你提供的HTML文檔來創見一個干凈的解析結果,無論HTML的格式是否完整。比如它可以處理:

  1、沒有關閉的標簽 (比如: <p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>)
  2、隱式標簽 (比如. 它可以自動將 <td>Table data</td>包裝成<table><tr><td>?)
  3、創建可靠的文檔結構(html標簽包含head 和 body,在head只出現恰當的元素)

    補充說明:文檔的對象模型簡述:

      1、文檔由多個Elements和TextNodes組成 (以及其它輔助nodes).
      2、其繼承結構如下:Document繼承Element繼承Node. TextNode繼承 Node.
      3、一個Element包含一個子節點集合,並擁有一個父Element。他們還提供了一個唯一的子元素過濾列表。

三、Jsoup通過URL解析html文檔   獲得Document對象  

  具體代碼如下:

public void testJsoupUrl() throws IOException{
        String url="http://ntbedi04:11080/edi/task/allTask";
        Document doc=Jsoup.connect(url).get();
        String title=doc.title();
        System.out.println("文檔的名稱:"+title);
    }

  connect(String url)創建一個新的Collection對象,然后通過get()獲得Document對象。

  connect()還有一些屬性可以滿足特殊的需求:

public void testJsoupUrlPost() throws IOException{
        String url="";
        Document doc = Jsoup.connect(url)
                  .data("query", "Java")   //post請求的參數
                  .userAgent("Mozilla")    //請求代理
                  .cookie("auth", "token")//cookie
                  .timeout(300000)   //請求時間的設置
                  .post();  
        System.out.println(doc.title());
    }

 

三、Jsoup解析本地文件html文件

public void testJsouploc() throws IOException{
        File htmlf=new File("C:/Users/Administrator/Desktop/choujiang.html");
        Document doc=Jsoup.parse(htmlf, "UTF-8");
        System.out.println(doc.title());
    }

對於相對路徑中的文件,可以用parse(File in,String charsetName,String baseUrl)

  baseUri 參數用於解決文件中URLs是相對路徑的問題。如果不需要可以傳入一個空的字符串。
  另外還有一個方法parse(File in, String charsetName) ,它使用文件的路徑做為 baseUri。 這個方法適用於如果被解析文件位於網站的本地文件系統,且相關鏈接也指向該文件系統。

 

四、Jsoup中Document對象的操作

  Elements這個對象提供了一系列類似於DOM的方法來查找元素,抽取並處理其中的數據。具體如下:
 查找元素
  getElementById(String id)
  getElementsByTag(String tag)
  getElementsByClass(String className)
  getElementsByAttribute(String key) (and related methods)
  Element siblings: siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling()
  Graph: parent(), children(), child(int index)

 元素數據
  attr(String key)獲取屬性attr(String key, String value)設置屬性
  attributes()獲取所有屬性
  id(), className() and classNames()
  text()獲取文本內容text(String value) 設置文本內容
  html()獲取元素內HTMLhtml(String value)設置元素內的HTML內容
  outerHtml()獲取元素外HTML內容
  data()獲取數據內容(例如:script和style標簽)
  tag() and tagName()

操作HTML和文本
  append(String html), prepend(String html)
  appendText(String text), prependText(String text)
  appendElement(String tagName), prependElement(String tagName)
  html(String value)

簡單實例:

public void testJsoupHtml(){
        String html="<table><tr><td>名稱</td><td>價格(元/本)</td><td>描述</td></tr><tr><td>《霧都的孤兒》</td><td>33.4</td><td>敘述霧都的孤兒</td></tr></table>";
        Document doc = Jsoup.parse(html);
        Elements tables=doc.getElementsByTag("table");
        Elements tdlist=tables.get(0).getElementsByTag("td");
    //輸出單元格中的內容
for (Element str : tdlist) { System.out.println(str.text()); } }

特別之處:獲得某個值或對象

  可以使用Element.select(String selector) 和 Elements.select(String selector) 方法實現:

Selector選擇器概述
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)]
*: 這個符號將匹配所有元素

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

偽選擇器selectors

:lt(n): 查找哪些元素的同級索引值(它的位置在DOM樹中是相對於它的父節點)小於n,比如:td:lt(3) 表示小於三列的元素
:gt(n):查找哪些元素的同級索引值大於n,比如: div p:gt(2)表示哪些div中有包含2個以上的p元素
:eq(n): 查找哪些元素的同級索引值與n相等,比如:form input: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): 查找自身包含文本匹配指定正則表達式的元素

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM