您的位置:首页 > Web前端 > JavaScript

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

2016-06-22 08:43 435 查看
昨天想用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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: