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 抓取页面的数据实例详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)