转载自android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)
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
- package com.example.webdatashow;
- //使用HttpClient组件访问网络以及获取 网页内容的方法。
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.regex.MatchResult;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.apache.http.client.ClientProtocolException;
- import org.apache.http.client.ResponseHandler;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.BasicResponseHandler;
- import org.apache.http.impl.client.DefaultHttpClient;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.app.Activity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import android.widget.TextView;
- import android.widget.Toast;
- public class MainActivity2 extends Activity implements OnClickListener{
- ListView listview;
- private String TAG = "webdatashow";
- private Button jiazai;
- private TextView webDataShow;
- private String pediyUrl = "http://www.stdu.edu.cn/";
- Handler handler;
- List<Map<String, Object>> data;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- jiazai = (Button)findViewById(R.id.button1);
- webDataShow = (TextView)findViewById(R.id.webDataShow1);
- jiazai.setOnClickListener(this);
- }
- @Override
- public void onClick(View view) {
- handler = getHandler();
- ThreadStart();
- }
- /*httpClientWebData()
- * 返回值类型:String
- * 抓取网页的document
- *
- * */
- protected String httpClientWebData() {
- String content = null;
- DefaultHttpClient httpClinet = new DefaultHttpClient(); //创建一个HttpClient
- HttpGet httpGet = new HttpGet(pediyUrl);//创建一个GET请求
- ResponseHandler<String> responseHandler = new BasicResponseHandler();
- try {
- content = httpClinet.execute(httpGet, responseHandler);
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }//发送GET请求,并响应内容
- return content;
- }
- /*getDate()
- * 返回值类型:List<Map<String, Object>>
- * 提取网页document的所需内容
- *
- * */
- private List<Map<String, Object>> getDate() {
- String httpstring = httpClientWebData();
- List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
- Pattern p = Pattern.compile("latestnewsnews | </span>\s*<span style="white-space:pre"> </span><a href="(.*?)" title="(.*?)"");//正则表达式
- Matcher m = p.matcher(httpstring);
- while (m.find()) {
- MatchResult mr=m.toMatchResult();
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("title", mr.group(1));
- map.put("url", mr.group(2));
- result.add(map);
- }
- return result;
- }
- /*ThreadStart()
- * 开辟新线程
- *
- * */
- private void ThreadStart() {
- new Thread() {
- public void run() {
- Message msg = new Message();
- try {
- data = getDate();
- msg.what = data.size();
- } catch (Exception e) {
- e.printStackTrace();
- msg.what = -1;
- }
- handler.sendMessage(msg);
- }
- }.start();
- }
- private Handler getHandler() {
- return new Handler(){
- public void handleMessage(Message msg) {
- if (msg.what < 0) {
- Toast.makeText(MainActivity2.this, "数据获取失败", Toast.LENGTH_SHORT).show();
- }else {
- initListview();
- }
- }
- };
- }
- /*initListview()
- * 在listview中显示数据
- *
- * */
- private void initListview() {
- Toast.makeText(getApplicationContext(), "doing......", Toast.LENGTH_SHORT).show();
- ListView listView = (ListView) findViewById(R.id.listView1);
- listView.setAdapter(new SimpleAdapter(this,data , android.R.layout.simple_list_item_2,
- new String[] { "title","href" }, new int[] {
- android.R.id.text1,android.R.id.text2
- }));
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <TextView
- android:id="@+id/webDataShow1"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="" />
- <Button
- android:id="@+id/button1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="加载" />
- <ListView
- android:id="@+id/listView1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" >
- </ListView>
- </LinearLayout>
manifest.xml
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.webdatashow"
- android:versionCode="1"
- android:versionName="1.0" >
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="18" />
- <uses-permission android:name="android.permission.INTERNET" />
- <application
- 上一篇:没有了
- 下一篇:没有了