Jsoup 抓取頁(yè)面的數(shù)據(jù)實(shí)例詳解
Jsoup 抓取頁(yè)面的數(shù)據(jù)
需要使用的是jsoup-1.7.3.jar包 如果需要看文檔我下載請(qǐng)借一步到官網(wǎng):http://jsoup.org/
這里貼一下我用到的 Java工程的測(cè)試代碼
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") // 請(qǐng)求參數(shù) .userAgent("I ' m jsoup") // 設(shè)置 * User-Agent .cookie("auth", "token") // 設(shè)置 cookie .timeout(3000) // * 設(shè)置連接超時(shí)時(shí)間 .post(); */// 使用 POST 方法訪問(wèn) 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> 開源中國(guó)社區(qū) </title></head>" + "<body><p> 這里是 jsoup 項(xiàng)目的相關(guān)文章 </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); } /** * 獲取博客上的文章標(biāo)題和鏈接 */ 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(); } } /** * 獲取指定博客文章的內(nèi)容 */ 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(); } } }
下面來(lái)介紹android中使用Jsoup異步解析網(wǎng)頁(yè)的數(shù)據(jù) 請(qǐng)注意: 這里很容易遇到一個(gè)亂碼的問(wèn)題
1.配置文件:
AndroidManifest.xml中加 權(quán)限 <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>
主要異步加載數(shù)據(jù)的代碼
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(); } // 彈出"查看"對(duì)話框 @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_KEY: { ProgressDialog dialog = new ProgressDialog(this); dialog.setMessage("獲取數(shù)據(jù)中 請(qǐng)稍候..."); 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參數(shù)對(duì)應(yīng)AsyncTask中的第一個(gè)參數(shù) 這里的String返回值對(duì)應(yīng)AsyncTask的第三個(gè)參數(shù) * 該方法并不運(yùn)行在UI線程當(dāng)中,主要用于異步操作,所有在該方法中不能對(duì)UI當(dāng)中的空間進(jìn)行設(shè)置和修改 * 但是可以調(diào)用publish Progress方法觸發(fā)onProgressUpdate對(duì)UI進(jìn)行操作 */ @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參數(shù)對(duì)應(yīng)AsyncTask中的第三個(gè)參數(shù)(也就是接收doInBackground的返回值) * 在doInBackground方法執(zhí)行結(jié)束之后在運(yùn)行,并且運(yùn)行在UI線程當(dāng)中 可以對(duì)UI空間進(jìn)行設(shè)置 */ @Override protected void onPostExecute(String result) { webView.loadData(result, "text/html;charset=utf-8", null); textView.setText(result); removeDialog(DIALOG_KEY); } // 該方法運(yùn)行在UI線程當(dāng)中,并且運(yùn)行在UI線程當(dāng)中 可以對(duì)UI空間進(jìn)行設(shè)置 @Override protected void onPreExecute() { showDialog(DIALOG_KEY); } /** * 這里的Intege參數(shù)對(duì)應(yīng)AsyncTask中的第二個(gè)參數(shù) * 在doInBackground方法當(dāng)中,,每次調(diào)用publishProgress方法都會(huì)觸發(fā)onProgressUpdate執(zhí)行 * onProgressUpdate是在UI線程中執(zhí)行,所有可以對(duì)UI空間進(jìn)行操作 */ @Override protected void onProgressUpdate(Integer... values) { } } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- android使用Jsoup 抓取頁(yè)面的數(shù)據(jù)
- Android開發(fā)之利用jsoup解析HTML頁(yè)面的方法
- Java實(shí)現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲)
- Android使用Jsoup解析Html表格的方法
- Jsoup獲取全國(guó)地區(qū)數(shù)據(jù)屬性值(省市縣鎮(zhèn)村)
- Java中使用開源庫(kù)JSoup解析HTML文件實(shí)例
- crawler4j抓取頁(yè)面使用jsoup解析html時(shí)的解決方法
- Jsoup解析HTML實(shí)例及文檔方法詳解
- java使用Jsoup連接網(wǎng)站超時(shí)的解決方法
- java使用Jsoup組件生成word文檔
相關(guān)文章
Android開發(fā)手冊(cè)shape屬性和子屬性使用說(shuō)明
這篇文章主要為大家介紹了Android開發(fā)手冊(cè)shape屬性和子屬性使用說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06詳解Android封裝一個(gè)全局的BaseActivity
這篇文章主要介紹了詳解Android封裝一個(gè)全局的BaseActivity,對(duì)封裝感興趣的同學(xué),可以參考下2021-04-04Android編程實(shí)現(xiàn)等比例顯示圖片的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)等比例顯示圖片的方法,實(shí)例分析了Android等比例縮放圖片的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android滾動(dòng)菜單ListView實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Android滾動(dòng)菜單ListView實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Android開發(fā)強(qiáng)制橫屏和強(qiáng)制豎屏設(shè)置實(shí)例代碼
本篇文章主要介紹了Android開發(fā)強(qiáng)制橫屏和強(qiáng)制豎屏設(shè)置實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04Android開發(fā)中匿名設(shè)備標(biāo)識(shí)符OAID使用及初始化
這篇文章主要為大家介紹了Android開發(fā)中匿名設(shè)備標(biāo)識(shí)符OAID使用及初始化,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04flutter 動(dòng)手?jǐn)]一個(gè)城市選擇citypicker功能
在一些項(xiàng)目開發(fā)中經(jīng)常會(huì)用到城市選擇器功能,今天小編動(dòng)手?jǐn)]一個(gè)基于flutter 城市選擇citypicker功能,具體實(shí)現(xiàn)過(guò)程跟隨小編一起看看吧2021-08-08Android利用ConstraintLayout實(shí)現(xiàn)漂亮的動(dòng)畫詳解
最近在無(wú)意中看到一篇關(guān)于ConstraintLayout的文章,ConstraintLayout是Android Studio 2.2中主要的新增功能之一,下面這篇文章主要給大家介紹了關(guān)于Android利用ConstraintLayout實(shí)現(xiàn)漂亮的動(dòng)畫的相關(guān)資料,需要的朋友可以參考下。2017-05-05