Jsoup代码解读之一-概述
轉(zhuǎn)載自? ?Jsoup代碼解讀之一-概述
今天看到一個(gè)用python寫的抽取正文的東東,美滋滋的用Java實(shí)現(xiàn)了一番,放到了webmagic里,然后發(fā)現(xiàn)Jsoup里已經(jīng)有了…覺(jué)得自己各種不靠譜啊!算了,靜下心來(lái)學(xué)學(xué)好東西吧!
Jsoup是Java世界用作html解析和過(guò)濾的不二之選。支持將html解析為DOM樹(shù)、支持CSS Selector形式選擇、支持html過(guò)濾,本身還附帶了一個(gè)Http下載器。從今天開(kāi)始會(huì)寫一個(gè)Jsoup源碼解讀系列,比起之前的博客,盡量會(huì)寫的詳盡一些。
概述
Jsoup的代碼相當(dāng)簡(jiǎn)潔,Jsoup總共53個(gè)類,且沒(méi)有任何第三方包的依賴,對(duì)比最終發(fā)行包9.8M的SAXON,實(shí)在算得上是短小精悍了。
jsoup ├── examples #樣例,包括一個(gè)將html轉(zhuǎn)為純文本和一個(gè)抽取所有鏈接地址的例子。 ├── helper #一些工具類,包括讀取數(shù)據(jù)、處理連接以及字符串轉(zhuǎn)換的工具 ├── nodes #DOM節(jié)點(diǎn)定義 ├── parser #解析html并轉(zhuǎn)換為DOM樹(shù) ├── safety #安全相關(guān),包括白名單及html過(guò)濾 └── select #選擇器,支持CSS Selector以及NodeVisitor格式的遍歷使用
Jsoup的入口是Jsoup類。examples包里提供了兩個(gè)例子,解析html后,分別用CSS Selector以及NodeVisitor來(lái)操作Dom元素。
這里用ListLinks里的例子來(lái)說(shuō)明如何調(diào)用Jsoup:
<!-- lang: java --> public static void main(String[] args) throws IOException {Validate.isTrue(args.length == 1, "usage: supply url to fetch");String url = args[0];print("Fetching %s...", url);// 下載url并解析成html DOM結(jié)構(gòu)Document doc = Jsoup.connect(url).get();// 使用select方法選擇元素,參數(shù)是CSS Selector表達(dá)式Elements links = doc.select("a[href]");print("\nLinks: (%d)", links.size());for (Element link : links) {//使用abs:前綴取絕對(duì)url地址print(" * a: <%s> (%s)", link.attr("abs:href"), trim(link.text(), 35));} }Jsoup使用了自己的一套DOM代碼體系,這里的Elements、Element等雖然名字和概念都與Java XML APIorg.w3c.dom類似,但并沒(méi)有代碼層面的關(guān)系。就是說(shuō)你想用XML的一套API來(lái)操作Jsoup的結(jié)果是辦不到的,但是正因?yàn)槿绱?#xff0c;才使得Jsoup可以拋棄xml里一些繁瑣的API,使得代碼更加簡(jiǎn)單。
還有一種方式是通過(guò)NodeVisitor來(lái)遍歷DOM樹(shù),這個(gè)在對(duì)整個(gè)html做分析和替換時(shí)比較有用:
<!-- lang: java --> public interface NodeVisitor {//遍歷到節(jié)點(diǎn)開(kāi)始時(shí),調(diào)用此方法public void head(Node node, int depth);//遍歷到節(jié)點(diǎn)結(jié)束時(shí)(所有子節(jié)點(diǎn)都已遍歷完),調(diào)用此方法public void tail(Node node, int depth); }HtmlToPlainText的例子說(shuō)明了如何使用NodeVisitor來(lái)遍歷DOM樹(shù),將html轉(zhuǎn)化為純文本,并將需要換行的標(biāo)簽替換為換行\(zhòng)n:
<!-- lang: java --> public static void main(String... args) throws IOException {Validate.isTrue(args.length == 1, "usage: supply url to fetch");String url = args[0];// fetch the specified URL and parse to a HTML DOMDocument doc = Jsoup.connect(url).get();HtmlToPlainText formatter = new HtmlToPlainText();String plainText = formatter.getPlainText(doc);System.out.println(plainText); }public String getPlainText(Element element) {//自定義一個(gè)NodeVisitor - FormattingVisitorFormattingVisitor formatter = new FormattingVisitor();//使用NodeTraversor來(lái)裝載FormattingVisitorNodeTraversor traversor = new NodeTraversor(formatter);//進(jìn)行遍歷traversor.traverse(element);return formatter.toString(); }下一節(jié)將從DOM結(jié)構(gòu)開(kāi)始對(duì)Jsoup代碼進(jìn)行分析。
總結(jié)
以上是生活随笔為你收集整理的Jsoup代码解读之一-概述的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最适合打游戏的电脑配置(电脑玩游戏的配置
- 下一篇: JAVA缓存的实现