也許你們有過在java運行平臺上解析html的經歷,一般的方式是將HTML以XML的形式進行結點解析,調用java自己的xml解析類庫。這樣的方式很容易理解而且很方便,但習慣用jQuery的各位是否在感嘆可否在java中像jQuery同樣獲取標籤內容,實現DOM操做呢?終於,發現了一個html解析利器,jsoup!html
初次用jsoup的時候是在業餘時間作一款漫畫下載器的時候發現的,作漫畫下載器時,因沒法獲得網站的API接口,因此只能經過解析HTML的方式得到網頁內容與圖片,在網絡上找到jsoup之後發現習慣於jquery方式編程的我很快就能夠適應jsoup的選擇器,獲得內容的方式也很容易,下面咱們就開始學習神奇的jsoup。java
1.下載jsoupjquery
你們能夠去jsoup的官網下載jsoup,或者點擊jsoup-1.7.3.jar(官方下載地址)正則表達式
2.jsoup初體驗編程
第一步 獲取html文檔對象。api
Document對象:用於接收html的文檔內容網絡
Jsoup.connect(String url).get():用於指定網址,返回值爲Document對象學習
ps:若是須要解析訪問較慢的網站的話須要加上timeout方法,以放拋出RuntimeException異常。網站
1 //文檔對象,用來接收html頁面 2 Document document = null; 3 try { 4 //獲取指定網址的頁面內容 5 document = Jsoup.connect("http://www.baidu.com/").timeout(50000).get(); 6 } catch (IOException e) { 7 e.printStackTrace(); 8 }
另外咱們除了經過網址的到HTML文檔對象外還能夠經過讀取HTML文件來獲取HTML文檔,方法以下:編碼
//得到文件對象 File input = new File("/tmp/input.html"); //得到文檔對象 Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
上面這段代碼很好理解,parse是Jsoup類的靜態方法,用於加載和解析HTML文檔,其中的三個參數分別爲:
參數1:要獲取的文件對象
參數2:HTML文檔的文字編碼例如UTF-8,ISO 8859-1,GBK等等
參數3:用於相對路徑的前綴
第二步 經過選擇器獲得想要的Dom結點
jsoup提供了豐富的選擇器,選擇器的方便程度媲美jQuery,其中的篩選選擇器,父選擇器等更是jQuery上自己就擁有的,具體該怎麼用這個選擇器呢?相信習慣jQuery的童鞋很快就會適應jsoup選擇器的。
首先咱們須要認識一下Elements對象,Elements類實現了java.lang.List接口,主要用於保存選擇器選擇到的結點。
接下來咱們來看一下Document對象獲取結點的步驟:
1 //經過Document的select方法獲取class爲abc的Elements結點集合 2 Elements elements = document.select(".abc"); 3 //獲得結點的第一個對象 4 Element element = elements.get(0); 5 //獲取想要的屬性值 6 String href = element.attr("href");
共三步,就能夠獲得想要的結果了,是否是很方便呢?
而且第二個步驟是能夠省略的,下面讓咱們來看一下Elements的attr()方法的源碼
/** Get an attribute value from the first matched element that has the attribute. @param attributeKey The attribute key. @return The attribute value from the first matched element that has the attribute.. If no elements were matched (isEmpty() == true), or if the no elements have the attribute, returns empty string. @see #hasAttr(String) */ public String attr(String attributeKey) { for (Element element : contents) { if (element.hasAttr(attributeKey)) return element.attr(attributeKey); } return ""; }
上邊兩個方法能夠清除的看到當咱們輸入結點名稱時,他會自動遍歷全部集合內全部結點是否擁有此屬性,若是擁有此屬性即跳出返回結果,如沒法找到含有此屬性的結點則返回 Empty。
jsoup的選擇器除了上面的例子裏的類選擇器還有下面的豐富選擇器,你們可根據須要來選擇使用。
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)]
*
: 這個符號將匹配全部元素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
: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)
: 查找自身包含文本匹配指定正則表達式的元素爲了照顧習慣js原生得到結點方式的朋友們,jsoup還加入了許多原生方法名,例如:
1 //經過ID得到結點,返回值爲Element而不是Elements 2 getElementById(String id) 3 //經過結點名返回節點集 4 getElementsByTag(String tag) 5 //經過類返回結點集 6 getElementsByClass(String className)
第三步 修改結點屬性
對於僅僅要讀取數據的朋友們來講上面兩步已經足以完成需求,而對於有修改文檔內容需求的來講Jsoup一樣提供了強大的屬性賦值,例如:
//爲結點添加內容 element.html(內容); //添加屬性 element.attr(屬性名,屬性值) //添加類 element.addClass(類名)
修改結點屬性的方式也與jQuery相似,也很容易理解。
若是你們已經瞭解了jsoup的基礎操做的話,能夠本身動手試試解析一個HTML文檔,若是有問題歡迎跟帖,另外附上兩個jsoup教程的網址:
jsoup英文版api: http://jsoup.org/apidocs/
英文好的同窗能夠去瞧瞧,jsoup實用的方法還有不少的哦!
jsoup中文版教程:http://www.open-open.com/jsoup/parsing-a-document.htm
^_^