入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

转载自android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)

创建时间:2016-09-18 投稿人: 浏览次数:3447
转载自http://blog.csdn.net/sac761/article/details/48379173
android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式) 标签: android开发爬虫技术xml解析html解析 2015-09-11 21:35 836人阅读 评论(0) 收藏 举报  分类:

网页有两种格式,一种是xml另一种是html,目前似乎好像大部分都是html格式的,查看网页格式的方法是在浏览器中右键-->查看源码

一,XML解析的三大方法

(1) SAX: Simple API for XML

SAX是一个解析速度快并且占用内存少的XML解析器。SAX解析XML文件采用的是事件驱动,也就是它并不需要解析完整个文档,
在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否符合XML语法中的某部分,如果符合则触发事件其实就是一些回调函数,
这些方法定义在ContentHandler

(2)DOM:Document Object Model

DOM解析是将XML文件全部载入,组成一颗dom树,然后通过节点以及节点之间的关系来解析XML文件。
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源。

(3)pull

Pull是Android内置的xml解析器。Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。


二,HTML解析的三大方法

(1)Jsoup

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。 这个方法很简便,但是成功率不大,不推荐。 (2)urlconnection 与httpclient相似,httpclient是增强版的urlconnection

(3)httpclient

HttpClient是一个很方便进行Http连接操作的工具包,用它可以设置代理和模拟浏览器下载网页。而HtmlParser则是一个开源的,可以对HTML进行处理的工具包,可以很方便的对HTML进行解析。


三,HttpClient源码讲解

本源码实现了抓取网页上的部分内容,并分栏显示出来,改进自laihuan99的博文Android抓取CSDN首页极客头条内容--网页数据抓取

MainActivity2.java

[java] view plain copy
  1. package com.example.webdatashow;  
  2.  //使用HttpClient组件访问网络以及获取 网页内容的方法。  
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.regex.MatchResult;  
  9. import java.util.regex.Matcher;  
  10. import java.util.regex.Pattern;  
  11.    
  12. import org.apache.http.client.ClientProtocolException;  
  13. import org.apache.http.client.ResponseHandler;  
  14. import org.apache.http.client.methods.HttpGet;  
  15. import org.apache.http.impl.client.BasicResponseHandler;  
  16. import org.apache.http.impl.client.DefaultHttpClient;  
  17. import android.os.Bundle;  
  18. import android.os.Handler;  
  19. import android.os.Message;  
  20. import android.app.Activity;  
  21.   
  22. import android.view.View;  
  23. import android.view.View.OnClickListener;  
  24.   
  25. import android.widget.Button;  
  26. import android.widget.ListView;  
  27. import android.widget.SimpleAdapter;  
  28. import android.widget.TextView;  
  29. import android.widget.Toast;  
  30.   
  31. public class MainActivity2 extends Activity implements OnClickListener{  
  32.     ListView listview;  
  33.     private String TAG = "webdatashow";  
  34.     private Button jiazai;  
  35.     private TextView webDataShow;  
  36.     private String pediyUrl = "http://www.stdu.edu.cn/";     
  37.     Handler handler;   
  38.     List<Map<String, Object>> data;  
  39.        
  40.     @Override  
  41.     protected void onCreate(Bundle savedInstanceState) {  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.main);    
  44.         jiazai = (Button)findViewById(R.id.button1);  
  45.         webDataShow = (TextView)findViewById(R.id.webDataShow1);  
  46.         jiazai.setOnClickListener(this);      
  47.     }  
  48.    
  49.     @Override  
  50.     public void onClick(View view) {  
  51.             handler = getHandler();  
  52.             ThreadStart();  
  53.     }  
  54.       
  55.     /*httpClientWebData() 
  56.      * 返回值类型:String 
  57.      * 抓取网页的document 
  58.      *  
  59.      * */  
  60.     protected String httpClientWebData() {  
  61.         String content = null;  
  62.         DefaultHttpClient httpClinet = new DefaultHttpClient(); //创建一个HttpClient   
  63.         HttpGet httpGet = new HttpGet(pediyUrl);//创建一个GET请求   
  64.         ResponseHandler<String> responseHandler = new BasicResponseHandler();           
  65.             try {  
  66.                 content = httpClinet.execute(httpGet, responseHandler);  
  67.             } catch (ClientProtocolException e) {  
  68.                 e.printStackTrace();  
  69.             } catch (IOException e) {  
  70.                 e.printStackTrace();  
  71.             }//发送GET请求,并响应内容  
  72.             return content;     
  73.     }  
  74.       
  75.     /*getDate() 
  76.      * 返回值类型:List<Map<String, Object>> 
  77.      * 提取网页document的所需内容 
  78.      *  
  79.      * */  
  80.     private List<Map<String, Object>> getDate() {  
  81.         String httpstring = httpClientWebData();  
  82.         List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();  
  83.         Pattern p = Pattern.compile("latestnewsnews  |  </span>\s*<span style="white-space:pre"> </span><a href="(.*?)" title="(.*?)"");//正则表达式  
  84.         Matcher m = p.matcher(httpstring);  
  85.         while (m.find()) {  
  86.             MatchResult mr=m.toMatchResult();  
  87.             Map<String, Object> map = new HashMap<String, Object>();  
  88.             map.put("title", mr.group(1));  
  89.             map.put("url", mr.group(2));  
  90.             result.add(map);  
  91.         }  
  92.         return result;    
  93.     }  
  94.       
  95.       /*ThreadStart() 
  96.      * 开辟新线程 
  97.      *  
  98.      * */  
  99.     private void ThreadStart() {  
  100.         new Thread() {  
  101.             public void run() {  
  102.                 Message msg = new Message();  
  103.                 try {  
  104.                     data = getDate();  
  105.                     msg.what = data.size();  
  106.                 } catch (Exception e) {  
  107.                     e.printStackTrace();  
  108.                     msg.what = -1;  
  109.                 }  
  110.                 handler.sendMessage(msg);  
  111.             }  
  112.         }.start();  
  113.     }  
  114.     private Handler getHandler() {  
  115.         return new Handler(){  
  116.             public void handleMessage(Message msg) {  
  117.                 if (msg.what < 0) {  
  118.                     Toast.makeText(MainActivity2.this, "数据获取失败", Toast.LENGTH_SHORT).show();  
  119.                 }else {  
  120.                     initListview();  
  121.                 }  
  122.             }  
  123.         };  
  124.     }  
  125.       
  126.       /*initListview() 
  127.      * 在listview中显示数据 
  128.      *  
  129.      * */  
  130.     private void initListview() {  
  131.         Toast.makeText(getApplicationContext(), "doing......", Toast.LENGTH_SHORT).show();   
  132.         ListView listView = (ListView) findViewById(R.id.listView1);      
  133.         listView.setAdapter(new SimpleAdapter(this,data , android.R.layout.simple_list_item_2,  
  134.                 new String[] { "title","href" }, new int[] {  
  135.                 android.R.id.text1,android.R.id.text2  
  136.         }));  
  137.   
  138.     }  
  139.   
  140. }  
main.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.    <TextView  
  7.        android:id="@+id/webDataShow1"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"   
  10.          android:text="" />  
  11.     <Button  
  12.         android:id="@+id/button1"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="加载" />  
  16.   
  17.     <ListView  
  18.         android:id="@+id/listView1"  
  19.         android:layout_width="fill_parent"  
  20.         android:layout_height="wrap_content" >  
  21.     </ListView>  
  22.       
  23.    
  24.   
  25. </LinearLayout>  

manifest.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.webdatashow"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="18" />  
  10. <uses-permission android:name="android.permission.INTERNET" />  
  11.     <application  
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像