在写Android程序时,有时需要解析HTML页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用 这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用 这个开源的解析器来实现。
Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。
示例:
//url网址作为输入源
Document doc = Jsoup.connect("http://www.example.com").timeout(60000).get();
//File文件作为输入源
File input = new File("/tmp/input.html"); Document doc = Jsoup.parse(input, "UTF-8", "http://www.example.com/");
//String作为输入源
Document doc = Jsoup.parse(htmlStr);
和java script类似,Jsoup提供了下列的函数
getElementById(String id) 通过id获得元素 getElementsByTag(String tag) 通过标签获得元素 getElementsByClass(String className) 通过class获得元素 getElementsByAttribute(String key) 通过属性获得元素 同时还提供下面的方法提供获取兄弟节点: siblingElements(), firstElementSibling(), lastElementSibling();nextElementSibling(), previousElementSibling() 用下面方法获得元素的数据: attr(String key) 获得元素的数据 attr(String key, String value) 设置元素数据 attributes() 获得所有属性 id(), className() classNames() 得到id class的值 text()得到文本值 text(String value) 设置文本值 html() 获取html html(String value)设置html outerHtml() 获得内部html data()获得数据内容 tag() 得到tag 和 tagName() 得到tagname
操作html提供了下面方法: append(String html), prepend(String html) appendText(String text), prependText(String text) appendElement(String tagName), prependElement(String tagName) html(String value)
下面举个列子,通过Jsoup抽取出一个DIV块里的所有链接地址。html文本如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试</title> </head> <body> 测试连接 <div class="my div"> <a href="page1.html">链接地址一</a><br> <a href="http://www.example.com/page2.html">链接地址二</a><br> </div> </body> </html>
Android java代码如下:
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements;
Document doc = Jsoup.connect("http://www.example.com").timeout(60000).get(); Elements divs = doc.select("div.my div"); StringBuilder linkBuffer = new StringBuilder(); if (divs != null) { for (Element div : divs) { Elements links = div.select("a[href]"); if (null != links) { for (Element link : links) { linkBuffer.append(link.attr("abs:href"));//相对地址会自动转成绝对url地址 linkBuffer.append(" "); linkBuffer.append(link.text()); } } } }
对于Jsoup更详细的信息,可以看官网的文档。http://www.open-open.com/jsoup
以上代码在Android 1.6及以上版本的手机上测试通过。
注意事项:
如果手机是通过wap方式联网,有可能需要设置http proxy,设置方式如下(代码放置在Jsoup.connect调用之前):
String host = android.net.Proxy.getDefaultHost(); int port = android.net.Proxy.getDefaultPort(); if (host != null && port != -1) { System.getProperties().setProperty("proxySet", "true"); System.setProperty("http.proxyHost", host); System.setProperty("http.proxyPort", Integer.toString(port)); }
本文出自 “” 博客,请务必保留此出处