开发客户端之获取网页内容
APKBUS上的一篇 #友盟杯#一步步教你为网站开发Android客户端极具指导意义。虽然你可能从上面直接用到的代码不多,但是学习这个思路是必须的。
使用到包括但不限于: HttpWatch抓包,HttpClient模拟POST请求,Jsoup解析HTML代码,
HttpWatch抓取网页内容
这是一个网页数据分析工具.可以查看到你发送/接受的数据.特别是post提交的数据,在某些需要登录的网页中尤为重要。 这个软件是以插件形式存在IE中的
稍微熟悉一下就知道这个软件是怎么用的了。基本上刷新出来的页面内容在Summary的最上面的文件中,URL就是当前浏览器地址栏的地址,这个软件支持导出你抓取到的东西。
为了便于查看,我将文件导出后用Sublime Text查看。
从这里可以看到我们想要获取的内容。
使用Jsoup进行数据抽取
Jsoup的说明文档:
Document doc = Jsoup.connect("http://example.com/").get();
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
}
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();
}
}; 测试结果如图: ![](http://ww2.sinaimg.cn/mw690/69443115jw1el79wpvn5kj20u01e07aw.jpg)
参考: