Jsoup使用随记
这段时间工作比较空闲,在网上找资料学习的时候看到数据抓取这一块,来了兴趣
用jsoup实现数据抓取着实方便,唯一美中不足的是官方API是英文版的,对我这样英语水平不好的程序员来说着实困扰,只能一点点的去实践
所以有了这篇随记,以后用的时候好回头温习温习
Jsoup的一系列解析html操作是基于Document这个实例对象的,实例化方式有很多种,通过url,通过文件,通过字符串。
这里我用的是url的方式,用来解析一个网站上的某些内容
eg:
Document doc = Jsoup.connect(url).get();
这个是官方提供的实例化方法,然而我使用的时候控制台报错
org.jsoup.HttpStatusException: HTTP error fetching URL. Status=403, URL=XXX
后来网上找了一下原因:
有些网站的服务器在响应http请求的时候,需要客户端提交的信息比较完善,而在Jsoup的Connection类中这个Header就是完善请求信息用的。
我们的浏览器在请求网页的时候会在请求的头部head中发送一些数据,比如浏览器类型,版本,语言等等。当我们用Jsoup去完成请求网页的工作时,最好也要完善请求包头信息,完成这个工作的就是header方法。
在实例化的时候加上
Document doc = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get();
就能解决这个报错问题
doc操作方法,大部分跟JavaScript中的差不多,见名知意
getElementsByTag() : 获取某个节点
getElementsByClass() : 获取某个class中的节点
getElementById() : 获取某个id中的节点
等等
通过这些方法返回的是Element对象
通过Element对象可以继续往下操作
children() : 获取子节点,这个我试过,获取到的只是第一个子节点
text() : 获取文本
attr() : 获取该节点的属性值
放上一段代码片:
Document docu = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get(); Elements ele = docu.getElementsByClass("text"); //获取class为text的节点内容 for(Element e : ele){ //循环 Elements uurl = e.children(); String t = uurl.text(); //获取标题 String hr = uurl.attr("href"); //获取链接 Document docum = Jsoup.connect(hr).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31").get(); //根据上一步获取的链接,执行解析该链接的html Element elem = docum.getElementById("contentText"); Elements elems = elem.getElementsByTag("p"); String text = elems.text(); //获取内容 }
代码片段是用来抓取某网站的数据