爬虫相关(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。


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