// 直接從字符串中輸入 HTML 文檔String html = "開源中國社區(qū) " + "這里是 jsoup 項(xiàng)目的相關(guān)文章
";Document doc = Jsoup.parse(html); // 從URL直接加載 HTML 文檔Document doc = Jsoup.connect("http://www.oschina.net/").get();String title = doc.title(); Document doc = Jsoup.connect("http://www.oschina.net/") .data("query", "Java") //請(qǐng)求參數(shù) .userAgent("I’m jsoup") //設(shè)置User-Agent .cookie("auth", "token") //設(shè)置cookie .timeout(3000) //設(shè)置連接超時(shí)時(shí)間 .post(); //使用POST方法訪問URL // 從文件中加載 HTML 文檔File input = new File("D:/test.html");Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");
請(qǐng)大家注意最后一種 HTML 文檔輸入方式中的 parse 的第三個(gè)參數(shù),為什么需要在這里指定一個(gè)網(wǎng)址呢(雖然可以不指定,如第一種方法)?因?yàn)?HTML 文檔中會(huì)有很多例如鏈接、圖片以及所引用的外部腳本、css文件等,而第三個(gè)名為 baseURL 的參數(shù)的意思就是當(dāng) HTML 文檔使用相對(duì)路徑方式引用外部文件時(shí),jsoup 會(huì)自動(dòng)為這些 URL 加上一個(gè)前綴,也就是這個(gè) baseURL。
例如 開源軟件 會(huì)被轉(zhuǎn)換成 開源軟件。
解析并提取 HTML 元素
這部分涉及一個(gè) HTML 解析器最基本的功能,但 jsoup 使用一種有別于其他開源項(xiàng)目的方式??選擇器,我們將在最后一部分詳細(xì)介紹 jsoup 選擇器,本節(jié)中你將看到 jsoup 是如何用最簡(jiǎn)單的代碼實(shí)現(xiàn)。
不過 jsoup 也提供了傳統(tǒng)的 DOM 方式的元素解析,看看下面的代碼:
File input = new File("D:/test.html");Document doc = Jsoup.parse(input, "UTF-8", "http://www.oschina.net/"); Element content = doc.getElementById("content");Elements links = content.getElementsByTag("a");for (Element link : links) { String linkHref = link.attr("href"); String linkText = link.text();}
你可能會(huì)覺得 jsoup 的方法似曾相識(shí),沒錯(cuò),像 getElementById 和 getElementsByTag 方法跟 JavaScript 的方法名稱是一樣的,功能也完全一致。你可以根據(jù)節(jié)點(diǎn)名稱或者是 HTML 元素的 id 來獲取對(duì)應(yīng)的元素或者元素列表。
與 htmlparser 項(xiàng)目不同的是,jsoup 并沒有為 HTML 元素定義一個(gè)對(duì)應(yīng)的類,一般一個(gè) HTML 元素的組成部分包括:節(jié)點(diǎn)名、屬性和文本,jsoup 提供簡(jiǎn)單的方法供你自己檢索這些數(shù)據(jù),這也是 jsoup 保持瘦身的原因。
而在元素檢索方面,jsoup 的選擇器簡(jiǎn)直無所不能,
File input = new File("D:\test.html");Document doc = Jsoup.parse(input,"UTF-8","http://www.oschina.net/"); Elements links = doc.select("a[href]"); // 具有 href 屬性的鏈接Elements pngs = doc.select("img[src$=.png]");//所有引用png圖片的元素 Element masthead = doc.select("div.masthead").first();// 找出定義了 class=masthead 的元素 Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
這是 jsoup 真正讓我折服的地方,jsoup 使用跟 jQuery 一模一樣的選擇器對(duì)元素進(jìn)行檢索,以上的檢索方法如果換成是其他的 HTML 解釋器,至少都需要很多行代碼,而 jsoup 只需要一行代碼即可完成。
jsoup 的選擇器還支持表達(dá)式功能,我們將在最后一節(jié)介紹這個(gè)超強(qiáng)的選擇器。
修改數(shù)據(jù)
在解析文檔的同時(shí),我們可能會(huì)需要對(duì)文檔中的某些元素進(jìn)行修改,例如我們可以為文檔中的所有圖片增加可點(diǎn)擊鏈接、修改鏈接地址或者是修改文本等。
下面是一些簡(jiǎn)單的例子:
doc.select("div.comments a").attr("rel", "nofollow");//為所有鏈接增加 rel=nofollow 屬性 doc.select("div.comments a").addClass("mylinkclass");//為所有鏈接增加 class=mylinkclass 屬性 doc.select("img").removeAttr("onclick"); //刪除所有圖片的onclick屬性 doc.select("input[type=text]").val(""); //清空所有文本輸入框中的文本
道理很簡(jiǎn)單,你只需要利用 jsoup 的選擇器找出元素,然后就可以通過以上的方法來進(jìn)行修改,除了無法修改標(biāo)簽名外(可以刪除后再插入新的元素),包括元素的屬性和文本都可以修改。
修改完直接調(diào)用 Element(s) 的 html() 方法就可以獲取修改完的 HTML 文檔。
HTML 文檔清理
jsoup 在提供強(qiáng)大的 API 同時(shí),人性化方面也做得非常好。在做網(wǎng)站的時(shí)候,經(jīng)常會(huì)提供用戶評(píng)論的功能。有些用戶比較淘氣,會(huì)搞一些腳本到評(píng)論內(nèi)容中,而這些腳本可能會(huì)破壞整個(gè)頁面的行為,更嚴(yán)重的是獲取一些機(jī)要信息,例如 XSS 跨站點(diǎn)攻擊之類的。
jsoup 對(duì)這方面的支持非常強(qiáng)大,使用非常簡(jiǎn)單??纯聪旅孢@段代碼:
String unsafe = "開源中國社區(qū)
";String safe = Jsoup.clean(unsafe, Whitelist.basic());//
開源中國社區(qū)
jsoup 使用一個(gè) Whitelist 類用來對(duì) HTML 文檔進(jìn)行過濾,該類提供幾個(gè)常用方法:
如果這五個(gè)過濾器都無法滿足你的要求呢,例如你允許用戶插入 flash 動(dòng)畫,沒關(guān)系,Whitelist 提供擴(kuò)展功能,例如 whitelist.addTags("embed","object","param","span","div"); 也可調(diào)用 addAttributes 為某些元素增加屬性。
jsoup 的過人之處??選擇器
前面我們已經(jīng)簡(jiǎn)單的介紹了 jsoup 是如何使用選擇器來對(duì)元素進(jìn)行檢索的。本節(jié)我們把重點(diǎn)放在選擇器本身強(qiáng)大的語法上。下表是 jsoup 選擇器的所有語法詳細(xì)列表。
基本用法
以上是最基本的選擇器語法,這些語法也可以組合起來使用,下面是 jsoup 支持的組合用法:
除了一些基本的語法以及這些語法進(jìn)行組合外,jsoup 還支持使用表達(dá)式進(jìn)行元素過濾選擇。下面是 jsoup 支持的所有表達(dá)式一覽表:
總結(jié)
jsoup 的基本功能到這里就介紹完畢,但由于 jsoup 良好的可擴(kuò)展性 API 設(shè)計(jì),你可以通過選擇器的定義來開發(fā)出非常強(qiáng)大的 HTML 解析功能。再加上 jsoup 項(xiàng)目本身的開發(fā)也非常活躍,因此如果你正在使用 Java ,需要對(duì) HTML 進(jìn)行處理,不妨試試。
以上摘自開源中國社區(qū):
附:
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com