爬蟲相關(3)----- 深度剖析Jsoup抓取數據

想要通過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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章