问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用jsoup抓取分页的问题

发布网友 发布时间:2022-04-21 03:14

我来回答

5个回答

懂视网 时间:2022-04-21 07:35

需要使用的是jsoup-1.7.3.jar包 如果需要看文档我下载请借一步到官网  

这里贴一下我用到的 Java工程的测试代码 

package com.javen.Jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupTest {
 static String url="http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html";
 /**
 * @param args
 * @throws Exception
 */
 public static void main(String[] args) throws Exception {
 
 // TODO Auto-generated method stub
 BolgBody();
 //test();
 //Blog();
 /*
  * Document doc = Jsoup.connect("http://www.oschina.net/")
  * .data("query", "Java") // 请求参数 .userAgent("I ’ m jsoup") // 设置
  * User-Agent .cookie("auth", "token") // 设置 cookie .timeout(3000) //
  * 设置连接超时时间 .post();
  */// 使用 POST 方法访问 URL

 /*
  * // 从文件中加载 HTML 文档 File input = new File("D:/test.html"); Document doc
  * = Jsoup.parse(input,"UTF-8","http://www.oschina.net/");
  */
 }

 /**
 * 获取指定HTML 文档指定的body
 * @throws IOException
 */
 private static void BolgBody() throws IOException {
 // 直接从字符串中输入 HTML 文档
 String html = "<html><head><title> 开源中国社区 </title></head>"
  + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>";
 Document doc = Jsoup.parse(html);
 System.out.println(doc.body());
 
 
 // 从 URL 直接加载 HTML 文档
 Document doc2 = Jsoup.connect(url).get();
 String title = doc2.body().toString();
 System.out.println(title);
 }

 /**
 * 获取博客上的文章标题和链接
 */
 public static void article() {
 Document doc;
 try {
  doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/").get();
  Elements ListDiv = doc.getElementsByAttributeValue("class","postTitle");
  for (Element element :ListDiv) {
  Elements links = element.getElementsByTag("a");
  for (Element link : links) {
   String linkHref = link.attr("href");
   String linkText = link.text().trim();
   System.out.println(linkHref);
   System.out.println(linkText);
  }
  }
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

 }
 /**
 * 获取指定博客文章的内容
 */
 public static void Blog() {
 Document doc;
 try {
  doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html").get();
  Elements ListDiv = doc.getElementsByAttributeValue("class","postBody");
  for (Element element :ListDiv) {
  System.out.println(element.html());
  }
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 
 }

}

下面来介绍android中使用Jsoup异步解析网页的数据 请注意: 这里很容易遇到一个乱码的稳定

配置文件:AndroidManifest.xml中加 权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

layout的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

 <WebView
 android:id="@+id/webView"
 android:layout_width="fill_parent"
 android:layout_height="200dp" />

 <ScrollView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" >

 <TextView
  android:id="@+id/textView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/hello_world" />
 </ScrollView>

</LinearLayout>

主要异步加载数据的代码

package com.javen.aaa;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.widget.TextView;

public class MainActivity extends Activity {
 private WebView webView;
 private TextView textView;
 private static final int DIALOG_KEY = 0;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 webView = (WebView) findViewById(R.id.webView);
 textView=(TextView) findViewById(R.id.textView);
 try {
  ProgressAsyncTask asyncTask=new ProgressAsyncTask(webView,textView);
  asyncTask.execute(10000);
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 }
 
 public String test() {
 StringBuffer buffer=new StringBuffer();
 Document doc;
 try {
  doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/").get();
  Elements ListDiv = doc.getElementsByAttributeValue("class","postTitle");
  for (Element element :ListDiv) {
  Elements links = element.getElementsByTag("a");
  for (Element link : links) {
   String linkHref = link.attr("href");
   String linkText = link.text().trim();
   buffer.append("linkHref=="+linkHref);
   buffer.append("linkText=="+linkText);
   
   System.out.println(linkHref);
   System.out.println(linkText);
  }
  }
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 return buffer.toString();

 }

 // 弹出"查看"对话框
 @Override
 protected Dialog onCreateDialog(int id) {
  switch (id) {
  case DIALOG_KEY: {
  ProgressDialog dialog = new ProgressDialog(this);
  dialog.setMessage("获取数据中 请稍候...");
  dialog.setIndeterminate(true);
  dialog.setCancelable(true);
  return dialog;
  }
  }
  return null;
 }
 
 public static String readHtml(String myurl) {
  StringBuffer sb = new StringBuffer("");
  URL url;
  try {
  url = new URL(myurl);
  BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(), "gbk"));
  String s = "";
  while ((s = br.readLine()) != null) {
   sb.append(s + "
");
  }
  } catch (Exception e) {
  e.printStackTrace();
  }
  return sb.toString();
 }
 
 class ProgressAsyncTask extends AsyncTask<Integer, Integer, String> {

 private WebView webView;
 private TextView textView;
 public ProgressAsyncTask(WebView webView,TextView textView) {
  super();
  this.webView=webView;
  this.textView=textView;
 }

 /**
  * 这里的Integer参数对应AsyncTask中的第一个参数 这里的String返回值对应AsyncTask的第三个参数
  * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改
  * 但是可以调用publish Progress方法触发onProgressUpdate对UI进行操作
  */
 @Override
 protected String doInBackground(Integer... params) {
  String str =null;
  Document doc = null;
  try {
//  String url ="http://www.cnblogs.com/zyw-205520/p/3355681.html";
//  
//  doc= Jsoup.parse(new URL(url).openStream(),"utf-8", url);
//  //doc = Jsoup.parse(readHtml(url));
//  //doc=Jsoup.connect(url).get();
//  str=doc.body().toString();
  doc = Jsoup.connect("http://www.cnblogs.com/zyw-205520/archive/2012/12/20/2826402.html").get();
  Elements ListDiv = doc.getElementsByAttributeValue("class","postBody");
  for (Element element :ListDiv) {
   str=element.html();
   System.out.println(element.html());
  }
  Log.d("doInBackground", str.toString());
  System.out.println(str);
  //你可以试试GBK或UTF-8
  } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  return str.toString() ;
  //return test();
 }

 /**
  * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)
  * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
  */
 @Override
 protected void onPostExecute(String result) {
  webView.loadData(result, "text/html;charset=utf-8", null);
  textView.setText(result);
  removeDialog(DIALOG_KEY);
 }

 // 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
 @Override
 protected void onPreExecute() {
  showDialog(DIALOG_KEY);
 }

 /**
  * 这里的Intege参数对应AsyncTask中的第二个参数
  * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
  * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
  */
 @Override
 protected void onProgressUpdate(Integer... values) {
  
 }
 }

}

热心网友 时间:2022-04-21 04:43

这几天正在研究。废话不多说,直接上代码,自己研究的,通过迭代抓取。pageList就是抓取的分页页面的全部链接地址 。
其中Document doc = NetUtils.getDocument(url);是jsoup抓取页面的基本操作。
public class HtmlAnalsysTest3 {
static String url = "http://www.win4000.com/mt/huge.html";
public static void main(String[] args) {
analsysPage(url);
for(String hurl : pageList){
System.out.println(" hurl-->"+hurl);
}
}
//已经抓取的用来迭代过滤
static List<String> hisurl = new ArrayList<String>();
//所需要分页链接集合
static List<String> pageList = new ArrayList<String>();
private static void analsysPage(String url){
if(hisurl.contains(url)){
System.out.println("hisurl :"+hisurl.size());
return;
}
Document doc = NetUtils.getDocument(url);
if(doc==null){
System.out.println("doc is null "+url);
return;
}
hisurl.add(url);
String tag = "body a";
String attr = "abs:href";
String herfcontent = "mt/huge";//只筛选胡歌的连接

Elements elemens = doc.select(tag);
for(Element e : elemens){
String href = e.attr(attr);
if(!href.contains(herfcontent)){
continue;
}
//System.out.println("页面page :"+ href);
if(!pageList.contains(href)){
pageList.add(href);
}
analsysPage(href);//迭代抓取,迭代过程会自动找后后续的页面
}
}
}
最终结果输出:
hurl-->http://www.win4000.com/mt/huge_2.html
hurl-->http://www.win4000.com/mt/huge_1.html
hurl-->http://www.win4000.com/mt/huge_3.html
hurl-->http://www.win4000.com/mt/huge_4.html
hurl-->http://www.win4000.com/mt/huge_5.html
hurl-->http://www.win4000.com/mt/huge.html

热心网友 时间:2022-04-21 06:01

觉得吧~如果你想抓取网页分页信息可以使用第三方工具进行抓取,但是问题就来了,加入你是要自己程序实现的话,这样就很麻烦。所以建议自己实现比较好。因为分页内容,每一页都有一个特定的链接,而且很相似,就只有那个指定页数的参数不同而已。所以你可以先用遍历方式将每个网页抓取后解析,然后再存起来,这样比较实际点。
但是我建议你可以在客户端也使用分页模式,这样的话,根据需求去获取,就不会一下子请求的数据量太大。

热心网友 时间:2022-04-21 07:36

可以这样,第一页的URL肯定是xxx/page_index=1这样的URL的,这个page_index就代表不同的页,所以只需要动态修改这个page_index就行了。

对于空指针的问题,可以考虑看看jsoup能否拿到状态码,只有等于200的时候才可以进行解析,或者捕捉异常、

热心网友 时间:2022-04-21 11:35

{public List<String> analysePage(String url, int startPage, int endpage) throws Exception { int endPage = 0;

List<String> links = new ArrayList<String>(); try { if (startPage<=1) {
url = "http://land.fang.com/market/________1_0_1.html";
}else {
url = "http://land.fang.com/market/________1_0_"+startPage+".html";
} // 通过过滤器过滤出<A>标签 Parser parser = new Parser(url);
NodeList nodeList = parser
.extractAllNodesThatMatch(new NodeFilter()
{ // 实现该方法,用以过滤标签 public boolean accept(Node node)
{ if (node instanceof LinkTag)// 标记 return true; return false;
}

}); // 打印 String tempPage =""; for (int i = 97; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i); // System.out.print(n.getStringText() + " ==>> "+n.extractLink().length()+"=="+i+"=="); if(n.extractLink().length()==69&&n.extractLink().contains("http://land.fang.com/market/")){
links.add(n.extractLink());
System.out.println(n.extractLink());
}
String title = n.getStringText(); if(isNumeric(title)){
endPage = Integer.parseInt(title)+1;

} if(isNumeric(tempPage)&&!isNumeric(title)){ break;
}
tempPage = title;

} //System.out.print(endPage+"--2222--"+links.size()); } catch (Exception e)
{
e.printStackTrace();
} if (startPage < endpage&& endpage<=endPage) {
links.addAll(analysePage(url, startPage + 1, endpage));
} for (int i=0;i<links.size();i++){ getData(links.get(i));
} return links;
} public static void getData(String introUrl){ try {
Document doc = Jsoup.connect(introUrl).get();
Elements newsHeadlines = doc.getElementsByClass("tablebox02 mt10");
Elements bianhao = doc.getElementsByClass("menubox01 mt20");
System.out.println(getSplitValue(bianhao.get(0).getElementsByTag("span").text(),":",1));

Element element = newsHeadlines.get(0).child(0);

System.out.println(element.child(0).child(0).child(1).text()); //地区 System.out.println(element.child(0).child(1).child(1).text()); //所在地 System.out.println(element.child(1).child(0).child(1).text()); //总面积 System.out.println(element.child(1).child(1).child(1).text()); // 建设用地面积 System.out.println(element.child(2).child(0).child(1).text()); //规划建筑面积 System.out.println(element.child(2).child(1).child(1).text()); //代征面积 System.out.println(getSplitValue(element.child(3).child(0).text(),":",1)); //容积率 System.out.println(getSplitValue(element.child(3).child(1).text(),":",1)); //绿化率 System.out.println(getSplitValue(element.child(4).child(0).text(),":",1)); //商业比例 System.out.println(getSplitValue(element.child(4).child(1).text(),":",1)); // 建筑密度 System.out.println(getSplitValue(element.child(5).child(0).text(),":",1)); //*高度 System.out.println(getSplitValue(element.child(5).child(1).text(),":",1)); //出让形式 System.out.println(getSplitValue(element.child(6).child(0).text(),":",1)); //出让年限 System.out.println(getSplitValue(element.child(6).child(1).text(),":",1)); //位置 System.out.println(getSplitValue(element.child(7).child(0).getElementsByAttribute("title").text(),":",1)); //标题 System.out.println(getSplitValue(element.child(7).child(1).child(1).text(),">>",0)); //规划用途 System.out.println("=========================");
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws Exception { new test().analysePage("http://land.fang.com/market/________1_0_1.html",1,1); // getDownloadUrl("http://land.fang.com/market/37eae58c-c701-4e4f-b1af-3e0c8e3be1c6.html"); } public static String getSplitValue(String value,String cha,int index){
String [] strings = value.split(cha); if (strings.length>index){ return strings[index].trim();
}else { return strings[0].trim();
}

}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? Win7系统不小心在声音管理器Digital Output里按了设为默认设备,接着就没声音嘞 win7如何设置两个声音默认设备 电脑声音默认设备是耳机 拔掉后电脑就没声了 免洗肥肠真的不需要洗吗? 送纸杯蛋糕,蛋挞,橘子,麻花是什么意思 麦基INS晒照:纸杯蛋糕是什么意思 为啥电脑平常解压文件都是30-40m,今天解压一个大文件就只有5m了? 麦基:很好奇纸杯蛋糕到底是什么意思 当兵男生在微信祝女生生活快乐为什么? 一个男人为什么不搭理你也不删你微信 安装网络打印机 已经搜到打印机 安装过程中提示出现错误 安装打印机驱动时出现错误怎么办啊 网络打印机安装出现这个错误,怎么解决呢? 我的Q号经常玩欢乐斗地主游戏,近几次莫名其妙被加入黑名单并且上面的100万欢乐豆还没开始玩全没了 QQ斗地主被加入黑名单 几十年都玩不了 怎么办呀 还让活吧 找不到解决的方法就去死了 用微信登陆斗地主已把好友加入黑名单好友会看到我在玩吗 我刚刚申请的QQ号,在欢乐斗地主中就被加入了黑名单,怎样取消黑名单,正常玩游戏 如何解除QQ斗地主黑名单 我的视频斗地主怎么解除黑名单 怎么样解除视频斗地主游戏的黑名单 win10为什么修改不了开机密码 为什么冬天在屋子待久了,出门时要在脸上摸几把? 我恋靴癖,平时很讨厌班主任但是班主任现在冬天,班主任穿了高跟的桶靴,特别想上去摸几把,怎么办,我们 你好,我有个问题问你,你说我要干净坚持的完成目标呢,还是去会所做技师工资几万摸几把好呢?请问你们怎_百度问一问 绿茶婊算什么~你们见识过处女婊么~那才是真正的心机高手 各位有让人笑出节奏感的笑话吗? 我太穷了 穷人与富人的区别就是,用时间买钱和用钱买时间 一个生理正常男人在喝了酒之后(有意识),能拒绝身边衣着暴露、身材妙曼的美女吗? 强制猥亵妇女罪的既未遂标志是什么?存在未遂情形吗? 我早上在车站遇到一个中年男人40岁左右她在尿尿然后一直砖头看着我眼神很流氓然后尿完她既然进来我们没 农村的闹洞房到底有多荒唐 穷人用什么对自己 我对不喜欢的人我不会动手动脚。男的为什么就会呢,我和他们关系不好,但是他们总是对我动手动脚 面对我的勾引,他这样的反应,是什么意思 急!电视没有hdmi接口,ps4怎么连接 怎么将一台ps4连到两个电视上 请问有什么网络电话可以用手机打,也可以呼叫转移至本人手机啊? 现在的网络电话可以实现被叫功能吗?就是别人打我的手机,我用网络电话接? 谁知道哪个网络电话是能用手机直接拨打到上面进行通话的?