• 使用Jsoup解析HTML页面


    Android开发系列十:使用Jsoup解析HTML页面
    在写Android程序时,有时需要解析HTML页面,特别是那类通过爬网站抓取数据的应用,比如:天气预报等应用。如果是桌面应用可以使用htmlparser这个强大的工具,但是在Android平台上使用会出现错误;另一种办法是使用正则表达式来抽取数据;再有一个办法是纯字符串查找定位来实现。文本将要介绍的是使用Jsoup这个开源的解析器来实现。
    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更详细的信息,可以看官网的文档。
    以上代码在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));
    }

    本文出自 “技术人生” 博客,请务必保留此出处http://zhaohaiyang.blog.51cto.com/2056753/735346

  • 相关阅读:
    前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)
    steps 步骤条、时间轴
    碰撞检测经典解决方案
    延迟渲染(Deferred Shading)技术详解
    配备透明触摸屏 看3D全息投影概念手机
    预渲染技术
    APK改之理(APK IDE)修改APK简单的入门教程
    如何获取显卡的GPU占用率和显存占用情况
    图像编辑之对比度调整 亮度对比度的算法公式
    别被你的双眼所欺骗 100张神奇的视觉欺骗图
  • 原文地址:https://www.cnblogs.com/shanzei/p/2419377.html
Copyright © 2020-2023  润新知