一、引入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): 查找自身包含文本匹配指定正則表達式的元素