云淡风轻的博客

寻门而入,破门而出(博客搬家至个人博客:http://wuyongshi.top)

Jsoup解析HTML页面数据(又扒到1万+的数据)
昨天想用Jsoup抓取一个页面中的歇后语,没想到竟然遇到了这么一个奇葩问题,解析多条相同的数据的时候只解析到1条数据
比如解析如下内容
<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");



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zml_2015/article/details/51731574
个人分类: Jsoup
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Jsoup解析HTML页面数据(又扒到1万+的数据)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭