您的位置:首页 > 理论基础 > 计算机网络

jsoup+httpclient获取sina、51博文内容

2013-09-15 12:34 330 查看
涉及的demo下载RometePro.rar ,编码utf-8两大jar简介HttpClient(要解析的网页内容)HttpClient 功能介绍以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)支持自动转向支持 HTTPS 协议支持代理服务器等jsoup(强大的网页内容解析,也可以做网页内容下载,但是网页处理等方面没有httpclient强大)jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。(比HTMLParser优秀多了)

jsoup的主要功能如下:

1. 从一个URL,文件或字符串中解析HTML;2. 使用DOM或CSS选择器来查找、取出数据;3. 可操作HTML元素、属性、文本;jsoup是基于MIT协议发布的,可放心使用于商业项目。jsoup 的主要类层次结构如下图所示:下载httpclient官网下载网盘下载下载JSOUP官网下载网盘下载涉及的demo下载RometePro.rar ,编码utf-8先来个效果sina博文解析内容,原地址:http://blog.sina.com.cn/s/blog_89cc52f20101d1sh.htmltextview内容显示的效果有以下1.有链接的自动设置链接(android:autoLink="all")2.链接地址可以像editview一样选中(可以通过触摸移动来选中链接地址),然后长安弹出复制对话框3.单击链接跳转到浏览器中实现访问解析sina博文AndroidManifest.xml中添加一下权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
布局使用滚动条布局 ScrollView
1)在textview中设置超链接 android:autoLink
=
"all"
2)android:fadingEdge
=
"vertical"
(可选项)设置拉滚动条时 ,边框渐变的放向。none(边框颜色不变),horizontal(水平方向颜色变淡),vertical(垂直方向颜色变淡)。
<?xml version="1.0" encoding="utf-8"?><ScrollView 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:background="@drawable/app_choose_btn_normalbg"android:fadingEdge="vertical"android:scrollbars="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:padding="5dp"android:orientation="horizontal"android:background="@drawable/grid_pictures_gdbg"><ImageViewandroid:id="@+id/remote_searchhome"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/remote_search_home"/><EditTextandroid:id="@+id/remote_searedit"android:layout_width="0dp"android:layout_height="40dp"android:layout_weight="1"android:singleLine="true"/><ImageViewandroid:id="@+id/remote_searchbtn"android:layout_width="40dp"android:layout_height="40dp"android:src="@drawable/search_btn_icon"/></LinearLayout><TextViewandroid:id="@+id/remotetext"android:layout_height="match_parent"android:layout_width="match_parent"android:gravity="top|left"android:background="@drawable/backmain_bg"android:textColor="@color/red"android:autoLink="all"/></LinearLayout></ScrollView>
将httpclient和jsoup加载进libs(拖入libs即可)编写java文件涉及的sina博文内容以 http://blog.sina.com.cn/s/blog_89cc52f20101d1sh.html 为例涉及的51cto博文内容以 《两年来的IT资源汇总 》获取网页内容 截取博文内容关键:
Jsoup
中有个根据网页的class标签为记号提取内容的函数
Document myDocument = Jsoup.parse(str);Elements links = myDocument.getElementsByClass(divclass);
在一个sina博文网页中通过网页分析得知博文内容的class为
articalContent
;网页内容获取与文章内容的提取
MySelfHttpClient
.java
import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.util.EntityUtils;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;public class MySelfHttpClient {//String divclass = "showContent";//51cto博客内容String divclass = "articalContent";//sina博客内容public MySelfHttpClient() {// TODO Auto-generated constructor stub}/***** @param link 链接地址* @param charSet 网页内容的编码类型* @return*/public String getStringFromLink(String link,String charSet){//获取网页完整内容String str = "";HttpGet request = new HttpGet(link);HttpClient httpClient = new DefaultHttpClient();try{HttpResponse response = httpClient.execute(request);if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){str = EntityUtils.toString(response.getEntity(), charSet);}else{str = "请求错误";}}catch(ClientProtocolException e){e.printStackTrace();}catch(IOException e){e.printStackTrace();}return str;}/**** @param str 截取divclass为标签的内容* @return 解析到的文章内容*/public String getContent(String str){//截取divclass为标签的内容String content = "";Document myDocument = Jsoup.parse(str);Elements links = myDocument.getElementsByClass(divclass);//Log.d("str", links.toString());for (Element link : links) {content =content + link.text();}return content;}}
判断系统是否联网网络诊断
ConnectionDetector
.java
import android.content.Context;import android.net.ConnectivityManager;import android.net.NetworkInfo;public class ConnectionDetector {private Context _context;public ConnectionDetector(Context context){this._context = context;}/***** @return true false  诊断是否联网*/public boolean isConnectingToInternet(){ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivity != null){NetworkInfo[] info = connectivity.getAllNetworkInfo();if (info != null)for (int i = 0; i < info.length; i++)if (info[i].getState() == NetworkInfo.State.CONNECTED){return true;}}return false;}}
主要的.java实现关键1:判断你要解析的网页的编码 ,在sina跟51cto的网页中均没有看到关于页面编码的,不过大多网页都是utf-8或gbk关键2:设置textview类似editview一样能长安链接然后进行复制
/**************************///使textview能像edittext一样能复制文本的链接内容remoteText.setFocusableInTouchMode(true);remoteText.setFocusable(true);remoteText.setClickable(true);remoteText.setLongClickable(true);remoteText.setMovementMethod(ArrowKeyMovementMethod.getInstance());/**************************/
主要实现
RemoteText
.java
package com.remote;import com.remotepro.R;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.text.method.ArrowKeyMovementMethod;import android.view.View;import android.view.Window;import android.view.View.OnClickListener;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;public class RemoteText extends Activity{TextView remoteText;EditText myEditText;ImageView mySearchBtn;ImageView myHomeBtn;MySelfHttpClient mySelfHttpClient;String link = "http://blog.sina.com.cn/s/blog_89cc52f20101d1sh.html"; //sina博客String charSet = "utf-8";//sina博客//String link = "http://7071976.blog.51cto.com/7061976/1289909";//String charSet = "gbk";String myText;//这句判断链接类型,在toast提示是否符合本次解析的网址类型String linktag = "http://blog.sina.com.cn";//以sina为列子ConnectionDetector myConnectionDetector;//诊断时否联网ProgressDialog myProgressDialog = null;//加载进度条@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.remotemain);init();}public void init(){remoteText = (TextView)findViewById(R.id.remotetext);myEditText = (EditText)findViewById(R.id.remote_searedit);mySearchBtn = (ImageView)findViewById(R.id.remote_searchbtn);myHomeBtn = (ImageView)findViewById(R.id.remote_searchhome);mySelfHttpClient = new MySelfHttpClient();myConnectionDetector = new ConnectionDetector(this);mySearchBtn.setOnClickListener(mySearcClick);myHomeBtn.setOnClickListener(myHomeClckListener);initText();}/***************************/public void initText(){if(myConnectionDetector.isConnectingToInternet()){myProgressDialog = ProgressDialog.show(this, getString(R.string.waiting), getResources().getString(R.string.loading));new InitTextThead().start();}}class InitTextThead extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();//获取解析内容myText = mySelfHttpClient.getContent(mySelfHttpClient.getStringFromLink(link, charSet));myHandler.sendEmptyMessage(1);}}Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);switch (msg.what) {case 1:/**************************///使textview能像edittext一样能复制文本的链接内容remoteText.setFocusableInTouchMode(true);remoteText.setFocusable(true);remoteText.setClickable(true);remoteText.setLongClickable(true);remoteText.setMovementMethod(ArrowKeyMovementMethod.getInstance());/**************************/remoteText.setText(myText);myProgressDialog.dismiss();break;case 2:remoteText.setFocusableInTouchMode(true);remoteText.setFocusable(true);remoteText.setClickable(true);remoteText.setLongClickable(true);remoteText.setMovementMethod(ArrowKeyMovementMethod.getInstance());remoteText.setText(myText);myProgressDialog.dismiss();break;case 3:myProgressDialog.dismiss();Toast.makeText(RemoteText.this, R.string.errorlingaddr, Toast.LENGTH_LONG).show();break;default:break;}}};/********************************/OnClickListener mySearcClick = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubsearchclick();}};public void searchclick(){if(myConnectionDetector.isConnectingToInternet()){myProgressDialog = ProgressDialog.show(this, getResources().getString(R.string.waiting), getResources().getString(R.string.loading));new SearchThread().start();}}class SearchThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();String link = myEditText.getText().toString();if(link.startsWith(linktag)){myText = mySelfHttpClient.getContent(mySelfHttpClient.getStringFromLink(link, charSet));myHandler.sendEmptyMessage(2);}else{myHandler.sendEmptyMessage(3);}}}/********************************/OnClickListener myHomeClckListener = new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubinitText();}};}
解析51cto博文,
MySelfHttpClient
.java,
RemoteText
.java的注释修改修改
MySelfHttpClient
.java
//String divclass = "showContent";//51cto博客内容String divclass = "articalContent";//sina博客内容
RemoteText
.java的注释,51cto的网页编码为gbk
String link = "http://blog.sina.com.cn/s/blog_89cc52f20101d1sh.html"; //sina博客String charSet = "utf-8";//sina博客//String link = "http://7071976.blog.51cto.com/7061976/1289909";//String charSet = "gbk";
如果要使用本软件中的edit输入框使用链接,还需修改RemoteText.java中的linktag内容,
MySelfHttpClient
.java
String linktag = "http://blog.sina.com.cn";//判断editview中的链接是否合法,这里以sina为例
class SearchThread extends Thread{@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();String link = myEditText.getText().toString();if(link.startsWith(linktag)){myText = mySelfHttpClient.getContent(mySelfHttpClient.getStringFromLink(link, charSet));myHandler.sendEmptyMessage(2);}else{myHandler.sendEmptyMessage(3);}}}
解析http://7071976.blog.51cto.com/7061976/1289909 博文内容效果如下总结:本文以获取博文内容为例,使用httpclient抓取网页内容,以jsoup为解析提取博文内容,看起来在text上显示的内容有点混乱,但这是可以改进的技术推广:就以井冈山大学图书管理系统为例,这套图书系统是学校租用外面公司的,安一般思路要开发图书馆里系统客户端需要后台数据库接出个站点提供数据检索,但那个公司不提供这方面的服务,那么可以通过httpclient解析网页实现登录,查询,续借等功能,这样一个android客户端的就能实现了。涉及的demo下载RometePro.rar ,编码utf-8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息