android使用Jsoup 抓取页面的数据

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup的官方中文地址:http://www.open-open.com/jsoup/parse-document-from-string.htm
在这个网站上你可以找到一些说明,.jar文件的下载,doc文档的说明等等 

jsoup的主要功能如下:

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找、取出数据;
  3. 可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目。

Jsoup类下面的方法都是静态可直接调用。几个方法的说明

Connect()方法,获得一个Connection,然后调用Connection对象get()方法获得Document对象。然后再解析Document对象  Connection提供了一些设置方法timeout(),url()等等

这里贴一下我用到的 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.jb51.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.jb51.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 + "\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) {

    }
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android Jsoup获取网站内容 android获取新闻标题实例

    近期做简单的新闻客户端界面使用到了Jsoup获取,使用起来特别方便,这也是被我一个学长称为学android网络必学的一个东西,在此也是分享一下自己近期所学. 首先还是给出效果: 上面是通过textview显示的一个从网站上获取的所有内容的显示,下面是通过listview显示一下获取的新闻的标题,如此显示比较便于理解. MainActivity: import android.app.Activity; import android.content.Intent; import android.n

  • Jsoup解析HTML实例及文档方法详解

    解析和遍历一个HTML文档 如何解析一个HTML文档: 复制代码 代码如下: String html = "<html><head><title>First parse</title></head>"  + "<body><p>Parsed HTML into a doc.</p></body></html>";Document doc = Jso

  • Java中使用开源库JSoup解析HTML文件实例

    HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的.你的浏览器会去解析HTML并替你去渲染它们.不过如果你需要自己在Java程序中解析HTML文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢?如果你已经使用Java编程多年了,我相信你肯定试过去解析XML,也使用过类似DOM或者SAX这样的解析器,不过很有可能你从未进行过任何的HTML解析的工作.更讽刺的是,在Jav

  • crawler4j抓取页面使用jsoup解析html时的解决方法

    crawler4j对已有编码的页面抓取效果不错,用jsoup解析,很多会jquery的程序员都可以操作.但是,crawler4j对response没有指定编码的页面,解析成乱码,很让人烦恼.在找了苦闷之中,无意间发现一年代已久的博文,可以解决问题,修改 Page.load() 中的 contentData 编码即可,这让我心中顿时舒坦了很多,接下来的问题都引刃而解了. 复制代码 代码如下: public void load(HttpEntity entity) throws Exception

  • Jsoup解析html实现招聘信息查询功能

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据. 下面是招聘网站的html信息: <div class="newlist_list_content" id="newlist_list_content_table"> <table width="853" class=&

  • Android使用Jsoup解析Html表格的方法

    本文实例讲述了Android使用Jsoup解析Html表格的方法.分享给大家供大家参考,具体如下: 看代码吧,可解析表中的label text button 自己根据需要再添加,呵呵 import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.jsoup.J

  • Java实现爬虫给App提供数据(Jsoup 网络爬虫)

    一.需求 最近基于 Material Design 重构了自己的新闻 App,数据来源是个问题. 有前人分析了知乎日报.凤凰新闻等 API,根据相应的 URL 可以获取新闻的 JSON 数据.为了锻炼写代码能力,笔者打算爬虫新闻页面,自己获取数据构建 API. 二.效果图 下图是原网站的页面 爬虫获取了数据,展示到 APP 手机端 三.爬虫思路 关于App 的实现过程可以参看这几篇文章,本文主要讲解一下如何爬虫数据. Android下录制App操作生成Gif动态图的全过程 :http://www

  • Android开发之利用jsoup解析HTML页面的方法

    本文实例讲述了Android利用jsoup解析HTML页面的方法.分享给大家供大家参考,具体如下: 这节主要是讲解jsoup解析HTML页面.由于在android开发过程中,不可避免的涉及到web页面的抓取,解析,展示等等,所以,在这里我主要展示下利用jsoup jar包来抓取cnbeta.com网站的话题分类的实例. 下面是主要的代码,由于使用及其简单,我这里就不再多说了: package com.android.web; import java.io.BufferedInputStream;

  • android使用Jsoup 抓取页面的数据

    jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据. Jsoup的官方中文地址:http://www.open-open.com/jsoup/parse-document-from-string.htm 在这个网站上你可以找到一些说明,.jar文件的下载,doc文档的说明等等 jsoup的主要功能如下: 从一个URL,文件或字符串中解析HTML: 使用DOM或

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

    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.

  • php抓取页面的几种方法详解

    在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据我们不能直接输出,往往需要对内容进行提取,然后再进行格式化,以更加友好的方式显现出来.下面简单说一下php抓取页面的几种方法及原理:一. PHP抓取页面的主要方法:1. file()函数    2. file_get_contents()函数  3. fopen()->fread()->fclose()模式 

  • php抓取页面与代码解析 推荐

    得到数据我们不能直接输出,往往需要对内容进行提取,然后再进行格式化,以更加友好的方式显现出来.下面先简单说一下本文的主要内容: 一. PHP抓取页面的主要方法: 1. file()函数 2. file_get_contents()函数 3. fopen()->fread()->fclose()模式 4.curl方式 5. fsockopen()函数 socket模式 6. 使用插件(如:http://sourceforge.net/projects/snoopy/) 二.PHP解析html或x

  • node基于puppeteer模拟登录抓取页面的实现

    关于热图 在网站分析行业中,网站热图能够很好的反应用户在网站的操作行为,具体分析用户的喜好,对网站进行针对性的优化,一个热图的例子(来源于ptengine) 上图中能很清晰的看到用户关注点在那,我们不关注产品中热图的功能如何,本篇文章就热图的实现做一下简单的分析和总结. 热图主流的实现方式 一般实现热图显示需要经过如下阶段: 1.获取网站页面 2.获取经过处理后的用户数据 3.绘制热图  本篇主要聚焦于阶段1来详细的介绍一下主流的在热图中获取网站页面的实现方式 4.使用iframe直接嵌入用户网

  • Python抓取移动App数据使用mitmweb监听请求与响应

    mitmproxy有3中监听请求与响应的方式: mitmproxy控制台方式 mitmdump与Python对接的方式 mitmweb可视化方式 前2种都是基于控制台的方式,尽管第2种通过与Python对接的方式可以利用Python编写一个可视化工具,但还需要进行大量的编码,如果要想直接用可视化的方式监听请求与响应数据,就需要使用第3种方式:mitmweb.这是一个Web版的可视化监听工具,执行mitmweb命令即可启动mitmweb服务,默认端口号是8081.启动mitmweb服务后,会在默认

  • Python实现抓取页面上链接的简单爬虫分享

    除了C/C++以外,我也接触过不少流行的语言,PHP.java.javascript.python,其中python可以说是操作起来最方便,缺点最少的语言了. 前几天想写爬虫,后来跟朋友商量了一下,决定过几天再一起写.爬虫里重要的一部分是抓取页面中的链接,我在这里简单的实现一下. 首先我们需要用到一个开源的模块,requests.这不是python自带的模块,需要从网上下载.解压与安装: 复制代码 代码如下: $ curl -OL https://github.com/kennethreitz/

  • PHP怎样用正则抓取页面中的网址

    前言 链接也就是超级链接,是从一个元素(文字.图片.视频等)链接到另一个元素(文字.图片.视频等).网页中的链接一般有三种,一种是绝对URL超链接,也就是一个页面的完整路径:另一种是相对URL超链接,一般都链接到同一网站的其他页面:还有一种是页面内的超链接,这种一般链接到同一页面内的其他位置. 搞清楚了链接的种类,就知道要抓链接,主要还是绝对URL超链接和相对URL超链接.要写出正确的正则表达式,就必须要了解我们查找的对象的模式. 先说绝对链接,也叫作URL(Uniform Resource L

  • vue使用jsonp抓取qq音乐数据的方法

    1.安装jsonp npm install jsonp 2.创建jsonp.js文件,内容如下: import originJSONP from 'jsonp' /** * 封装jsonp * @param {*} url 原始的jsonp第一个参数是url,第二个参数是option,这里为了比较好写参数做了下封装 * @param {obj} data 参数 * @param {*} option jsonp的option */ export default function jsonp (u

  • Vue项目中使用jsonp抓取跨域数据的方法

    下载jsonp npm install jsonp 在js文件夹下新增一个jsonp.js,来封装一个jsonp() 如何封装一个jsonp() 在下载的jsopn中,jsonp(url,options,callback)这个是原生jsonp方法中的参数: 引入下载的jsonp import originJsonp from 'jsonp': 导出自己定义的jsonp函数 //这个jsonp函数是我们自己定义的,与上面的originJsonp不是同一个,originJsonp是一个可以直接引用的

随机推荐