想要通過Jsoup來獲取信息可以通過document或者elements的getElementsBy****這類方法。也可以通過選擇器selector。
這兩種方法功能類似,但是selector由於功能強大,可以適應更加複雜的選擇條件。需要判斷什麼時候使用什麼方法還需要自己下面多多測試和總結。
首先說一下Document & Elements & Element & NodeList & Node 之間的轉化關係。
Document,是html加載之後生成的文件,包含了html的全部代碼。
Elements是指一系列的開閉標籤。
Element是一個開閉標籤,但是其內部可能也包含其他的一系列子標籤,所以Element和Elements是可以直接轉換的,通過選擇方法。
NodeList是一系列的單個的節點。
Node是一個節點。
(目前爲止我的理解也就是這樣)
Document = Jsoup.parse("new File("e:\\ddd\\dd\\.html")", "utf8", "baseurl") ; OR Document = Jsoup.connect("http:///****").timeout(5000).get() ;
Elements = document.getAllElements() ; //注意這個elements集合裏面包含所有的element,會有大量重複,比如body包含了div1,div2,div3,那麼就一共有四個element元素
Elements = element.select("jquery selector") ;
Element = elements.get(index) ;
下面給一個實例來說明怎樣提取信息。一個簡單的html代碼如下:
<div class="block untagged mb15 bs2" id='qiushi_tag_62967240'>
<div class="author">
<img src="http://static.qiushibaike.com/images/thumb/missing.png" alt="邪惡滴右手" />
<a href="/users/14402246" >邪惡滴右手 </a>
</div>
<div class="content" title="2014-03-03 07:52:37">
從來不看棒子劇的舉手!
</div>
</div>
最外層的block是叫做block untagged mb15 bs2, id 是qiushi_tag_6297240。
block 內層包括了兩個元素,一個是author information,另一個是content information。
java代碼如下:
String url = "E:\\EclipseWorkSpace\\Crawler\\src\\test3.html" ; //定義文件位置
this.doc = Jsoup.parse(new File(url), "utf8", "http://www.qiushibaike.com") ; //第三個參數是base url
Elements ele = this.doc.getAllElements(); //獲取所有element元素,有很多嵌套的重複的元素
Elements ele2 = ele.select("div[class=block untagged mb15 bs2]") ; //只獲取block的class爲特定值的elements,在這裏只有一個這樣的block
Element single = ele2.first() ; //獲取第一個block,返回值爲element對象
//獲取Author element
Element authorElement = single.getElementsByAttributeValue("class", "author").first() ; //獲取class屬性直爲author的elements的第一個
Element img = authorElement.select("img[src]").first() ; //得到author下<img src=" 後面的值
Element user = authorElement.select("a[href]").first() ; //得到author下 <a href=" 後面的值
String imgAttr = img.attr("src") ;
String userAttr = user.absUrl("href") ;
//獲取Content element
Element contentElement = single.getElementsByAttributeValue("class", "content").first() ;
String title = contentElement.attr("title") ;
String content = contentElement.text() ;
print(img.attr("src")) ;
print(user.absUrl("href")) ;
print(title) ;
print(content) ;
//print results
結果如下:
http://pic.qiushibaike.com/system/avtnew/1398/13984892/thumb/self_author.jpg
http://www.qiushibaike.com/users/13984892
2014-03-03 13:41:38
不要問哥去哪?哥哥割……我會告訴你哥今天去離婚!大嬸給過吧!哥心中滿是傷痕,七年就在瞬間各奔東西!可憐了孩子!那沒良心的女人也看,求組織做我的後援團,告訴她,沒她lz會過的更好!在此跪謝組織!
不太會用這個編輯器,尤其是插入代碼的時候,可能看起來比較一塌糊塗。將就將就吧。。。
另外說一句,使用element.text()返回這段html在頁面上返回的代碼,跟標籤裏面的元素都沒關係了。
使用element.attr()方法可以返回標籤裏某一個屬性的值,但不是標籤的tag value。