Jsoup解析HTML页面数据(又扒到1万+的数据)
2016-06-22 08:43
435 查看
昨天想用Jsoup抓取一个页面中的歇后语,没想到竟然遇到了这么一个奇葩问题,解析多条相同的数据的时候只解析到1条数据
比如解析如下内容
我解析td标签中的文本应该得到4条数据,但是得到的却只有
“坐轿里骂人
不识抬举
坐轿打瞌睡“
少了一个“不识抬举”,在网上搜了搜,没搜到相关的解决方案,后来用别人写的一个在线的例子,竟然出奇的抓到了所有的数据,难倒我写的代码有问题?后来经过一番折腾,发现代码没问题,是jar包的问题,我原来用的是jsopu-1.8.3.jar换成最新的jar包Jsoup-1.9.2就自然解决了……竟然是之前Jsoup未解决的bug,幸好被后来修复了。
那就分享一下我解析网页的源码好了,虽然网上已经多的是了,分享给正好看到的朋友
如果想获取网页中的连接,使用select("a").attr("href"),有的网站的超链接用的是相对路径,我们把它抓取下来的时候一定要换成绝对路径,这样我们在直接访问的时候才不至于说找不到页面
以上代码将会得到对应链接的绝对路径,其中属性为abs:href。同理,可以得到图片绝对路径abs:src。
比如解析如下内容
<tr class="even"> <td>坐轿里骂人</td> <td><a href="http://c.bumiu.cn/ju?wd=%B2%BB%CA%B6%CC%A7%BE%D9" target="_blank">不识抬举</a></td> </tr> <tr class="odd"> <td>坐轿打瞌睡</td> <td><a href="http://c.bumiu.cn/ju?wd=%B2%BB%CA%B6%CC%A7%BE%D9" target="_blank">不识抬举</a></td> </tr>
我解析td标签中的文本应该得到4条数据,但是得到的却只有
“坐轿里骂人
不识抬举
坐轿打瞌睡“
少了一个“不识抬举”,在网上搜了搜,没搜到相关的解决方案,后来用别人写的一个在线的例子,竟然出奇的抓到了所有的数据,难倒我写的代码有问题?后来经过一番折腾,发现代码没问题,是jar包的问题,我原来用的是jsopu-1.8.3.jar换成最新的jar包Jsoup-1.9.2就自然解决了……竟然是之前Jsoup未解决的bug,幸好被后来修复了。
那就分享一下我解析网页的源码好了,虽然网上已经多的是了,分享给正好看到的朋友
public class QueryAndSaveData { int pageid = 1; @Test//第6页出问题了 public void test() { long start = System.currentTimeMillis(); while (pageid<=702) { String url = "http://tool.chasfz.com/xiehouyu/?pageid="+pageid; saveXieHouYu(url); } long end = System.currentTimeMillis(); System.out.println("timeGaps:"+(end-start)); } private synchronized void saveXieHouYu(String url) { String serverString = HttpUtils.request(url,null);//网络请求数据,没有使用jsoup连接网络获取数据,感觉自己封装的网络请求时间更短 Document document = Jsoup.parse(serverString);//可以使用Jsoup自带的网络请求方式:Jsoup.connect(url).timeout(5000).get(); // String string = document.toString(); // System.out.println("document:"+string); Elements divsElements = document.select("table");//得到table标签中的内容 // String divString = divsElements.toString(); // System.out.println("divString:"+divString); Elements tds = divsElements.select("td");//获得table中的所有的td标签 XieHouYuDao xieHouYuDao = new XieHouYuDao(); int len = tds.size(); boolean flag = false; System.out.println("td的长度:"+len); for (int i = 0; i < tds.size(); i+=2) { //将解析到的数据依次存入数据库,下标为偶数的为问题,奇数的为答案 flag = xieHouYuDao.add(new Xiehouyu(tds.get(i).text(), tds.get(i+1).text()));//select("td").text()即可获得到标签中的内容 //System.out.println(tds.get(i).text()+","+ tds.get(i+1).text());System.out.print(flag);}if (!flag) {System.out.println();//打印出未被成功插入数据库的页数System.out.println("未成功插入的pageid:"+pageid);}pageid++;}}
如果想获取网页中的连接,使用select("a").attr("href"),有的网站的超链接用的是相对路径,我们把它抓取下来的时候一定要换成绝对路径,这样我们在直接访问的时候才不至于说找不到页面
for (Element item : items) { Elements links = item.select("a"); for(Element link: links){ link.attr("href",link.attr("abs:href")); } Elements imgs = item.select("img"); for(Element img: imgs){ img.attr("src",img.attr("abs:src")); }
以上代码将会得到对应链接的绝对路径,其中属性为abs:href。同理,可以得到图片绝对路径abs:src。
Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素 for(Element png:pngs){ String pngText=png.text(); String src=png.attr("src");//根据属性名获取src的路径 System.out.println(src+pngText); } //在id为tel的td标签里面添加一个value等于121212121的值 如:<td id="tel" value="121212121"></td> doc.getElementById("tel").val("121212121");// //在id为tel的td标签添加一个文本值 如:<td id="tel">121212121</td> doc.getElementById("tel").html("121212121");
相关文章推荐
- JSP 学习二
- js时间戳
- WEB编程的套路——简单好用的js函数(3)
- JavaScript 检查一个 JSON 对象中是否对存指这下的 Key
- JS内置对象(算术类Math)
- EL和JSTL表达式语言
- JS中单双引号的区别
- Javascript获取随机数的实现方法
- 浅谈JavaScript for循环 闭包
- 静态页面html中跳转传值的JS处理技巧
- JS 日期与时间戮相互转化的简单实例
- javascript时间戳和日期字符串相互转换代码(超简单)
- JS产生随机数的几个用法详解
- JS随机打乱数组的方法小结
- JS实现关闭当前页而不弹出提示框的方法
- JS实现刷新父页面不弹出提示框的方法
- Json解析的方法小结
- Javascript 5种方法实现过滤删除前后所有空格
- Javascript将双字节字符转换成单字节字符并计算长度
- Javascript实现图片不间断滚动的代码