Android开发--使用JSOUP解析HTML页面

Posted z_fishLong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android开发--使用JSOUP解析HTML页面相关的知识,希望对你有一定的参考价值。

在写android程序时,有时需要解析html页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用htmlparser这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用Jsoup这个开源的解析器来实现。

Jsoup既可以通过一个url网址,也可以通过存储html脚本的文件或者是存储html脚本的字符串作为数据源,然后通过DOM、CSS选择器来查找、抽取数据。 示例:

</pre><pre name="code" class="java"><pre name="code" class="java">//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更详细的信息,可以看官网的文档。 以上代码在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));

以上是关于Android开发--使用JSOUP解析HTML页面的主要内容,如果未能解决你的问题,请参考以下文章

将带有 jsoup 的 HTML 表解析为 android listview

Android解析HTML网页数据 第一个方法Jsoup

用于 android / iOS 开发的 FLUTTER 中的 HTML 解析

jsoup 解析HTML信息

Android - 使用 JSOUP 解析 JS 生成的 url

使用jsoup抓取和解析网页数据