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