Jsoup 抓取页面的数据实例详解

Jsoup 抓取页面的数据实例详解,第1张

概述Jsoup抓取页面的数据 需要使用的是jsoup-1.7.3.jar包  如果需要看文档我下载请借一步到官网:http://jsoup.org/  

Jsoup 抓取页面的数据

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

这里贴一下我用到的 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异步解析网页的数据 请注意: 这里很容易遇到一个乱码的问题

1.配置文件:

AndroIDManifest.xml中加 权限 <uses-permission androID:name="androID.permission.INTERNET"></uses-permission>

2.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();  }    // d出"查看"对话框    @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 + "\r\n");        }      } 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) {          }  }}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

总结

以上是内存溢出为你收集整理的Jsoup 抓取页面的数据实例详解全部内容,希望文章能够帮你解决Jsoup 抓取页面的数据实例详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1147416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存