开发客户端之获取网页内容

APKBUS上的一篇 #友盟杯#一步步教你为网站开发Android客户端极具指导意义。虽然你可能从上面直接用到的代码不多,但是学习这个思路是必须的。

使用到包括但不限于:
HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,

HttpWatch抓取网页内容

这是一个网页数据分析工具.可以查看到你发送/接受的数据.特别是post提交的数据,在某些需要登录的网页中尤为重要。
这个软件是以插件形式存在IE中的

稍微熟悉一下就知道这个软件是怎么用的了。基本上刷新出来的页面内容在Summary的最上面的文件中,URL就是当前浏览器地址栏的地址,这个软件支持导出你抓取到的东西。

为了便于查看,我将文件导出后用Sublime Text查看。

从这里可以看到我们想要获取的内容。

使用Jsoup进行数据抽取

Jsoup的说明文档:

从一个URL加载一个Document

Document doc = Jsoup.connect("http://example.com/").get();

使用DOM方法来遍历一个文档

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

从元素抽取属性,文本和HTML

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);//解析HTML字符串返回一个Document实现
Element link = doc.select("a").first();//查找第一个a元素

String text = doc.body().text(); // "An example link"//取得字符串中的文本
String linkHref = link.attr("href"); // "http://example.com/"//取得链接地址
String linkText = link.text(); // "example""//取得链接地址中的文本

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"//取得链接内的html内容

一开始在主线程直接写出网络请求时,调试的时候会异常退出,LogCat提示android.os.NetworkOnMainThreadException,解决的方法参见NetworkOnMainThreadException
修改后的代码如下:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
    parentView = inflater.inflate(R.layout.view_archive, container, false);
    listView   = (ListView) parentView.findViewById(R.id.listView);
    new Thread(runnable).start();
    return parentView;
}
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
    super.handleMessage(msg);
    Bundle data = msg.getData();
    String val = data.getString("value");
    Log.i("connect().get()", val);
    initView();
    }
};

ArrayList<String> arr = new ArrayList<String>();

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        Document doc = null;
        try {
        //从URL加载Document
        doc = Jsoup.connect("http://codesimple.bitcron.com/archive").get();
        //使用DOM方法来遍历文档并抽取元素
        Elements title = doc.getElementsByAttributeValue("class","title");
        for (Element element :title) {
            Elements links = element.getElementsByTag("a");
            //其实此处也可以不用写for (Element link : links)
            //因为按照("class","title")抽取的title,每组中只含有一组href和text
            //示例:<h1 class="title"><a href="/post/android/2014-09-30.kai-fa-ben-bo-ke-de-ke-hu-duan-er">开发本博客的客户端(二)获取网页内容</a></h1>
            for (Element link : links) {
                String linkHref = link.attr("href");
                String linkText = link.text().trim();
                arr.add(linkText);
                System.out.println(linkHref);
                System.out.println(linkText);
            }
        }
        Message msg = new Message();
        Bundle data = new Bundle();
        data.putString("value",title.toString());
        msg.setData(data);
        handler.sendMessage(msg);
    } catch (IOException e) {
        e.printStackTrace();
    }  
 };   

测试结果如图:

参考:

  1. #友盟杯#一步步教你为网站开发Android客户端
  2. 使用DOM方法来遍历一个文档
Comments
Write a Comment