美文网首页我爱编程
Android开发 - 抓取并解析网页数据(xml解析、html

Android开发 - 抓取并解析网页数据(xml解析、html

作者: HappyGhh | 来源:发表于2017-12-20 22:48 被阅读0次

    参考:android 开发--抓取网页解析网页内容的若干方法(网络爬虫)(正则表达式)

    网页有两种格式,一种是xml另一种是html,目前似乎好像大部分都是html格式的,查看网页格式的方法是在浏览器中右键-->查看源码或者直接F12即可。

    一、XML解析

    1)DOM解析

    DOM(Document Object Mode)是将XML文件的所有内容以文档树的方式存在内存中,通过节点以及节点之间的关系来解析XML文件。由于DOM操作会将整个XML文件存放在内存中,所以消耗内存大,较大的文档不采用这种方法解析。

    2)SAX解析

    SAX解析,逐行扫描XML文档,遇到标签时触发姐系处理器,采用事件处理的方式解析XML,在读取文档的同时即可对XML进行处理。可以解析超大XML,但是SAX解析只能读取XML中的数据,无法对数据进行增删改

    3)PULL解析

    PULL解析器是一个开源Java项目,既可用于Android应用也可用于JavaEE程序。Android中集成了PULL解析器,因此,Android中常用的就是PULL解析
    此处提供一个xml地址:http://bbs.csdn.net/recommend_tech_topics.atom

    使用案例:

    此处使用pull解析的方式

    需要解析的xml:

     <entry>
        <id>http://bbs.csdn.net/topics/392114349</id>
        <published>2017-03-08T15:51:57+08:00</published>
        <updated>2017-12-19T15:04:26+08:00</updated>
        <link rel="alternate" type="text/html" href="http://bbs.csdn.net/topics/392114349"/>
        <title>dubbo下如何使用hibernate的级联操作</title>
        <summary>dubbo下如何使用hibernate的级联操作</summary>
        <author>a461666405</author>
      </entry>
     <!--部分代码,具体点击上面链接 -->
    

    根据xml内容分类创建实体类即可。

    新建一个XMLSerivce工具类用来解析xml

    public class XMLService {
        // 返回信息集合
        public static List<Bean> getNewsInfo(InputStream is) throws Exception {
            XmlPullParser parser = Xml.newPullParser(); // 获取Pull解析器
            parser.setInput(is, "utf-8");
            List<Bean> list = null;
            Bean bean = null;
    
            // 得到当前事件的类型
            int type = parser.getEventType();
    
            while (type != XmlPullParser.END_DOCUMENT) {
    
                switch (type) {
                    // XML文档的开始START_DOCUMENT 例如:<?xml version="1.0" encoding="UTF-8"?> 0
                    case XmlPullParser.START_DOCUMENT:
                        list = new ArrayList<>();
                        break;
                    // XML文档节点开始START_TAG 例如:<entry> 2
                    case XmlPullParser.START_TAG:
                        bean = new Bean();
                        if ("entry".equals(parser.getName())) {
                            Log.e("XML", "<ebtry>");
    
    
                        } else if ("id".equals(parser.getName())) {
                            String path = parser.nextText();
                            bean.setPath(path);
                            Log.e("XML", "path == " + path + "parse == " + parser.getName());
    
                        } else if ("published".equals(parser.getName())) {
                            String published = parser.nextText();
                            bean.setPublised(published);
                            Log.e("XML", "published == " + published + "parse == " + parser.getName());
    
                        } else if ("updated".equals(parser.getName())) {
                            String updtaed = parser.nextText();
                            bean.setUpdated(updtaed);
                            Log.e("XML", "updated == " + updtaed + "parse == " + parser.getName());
    
                        } else if ("title".equals(parser.getName())) {
                            String title = parser.nextText();
                            bean.setTitle(title);
                            Log.e("XML", "title == " + title + "parse == " + parser.getName());
    
                        } else if ("summary".equals(parser.getName())) {
                            String summary = parser.nextText();
                            bean.setUpdated(summary);
                            Log.e("XML", "summary == " + summary + "parse == " + parser.getName());
    
                        } else if ("author".equals(parser.getName())) {
                            String author = parser.nextText();
                            bean.setUpdated(author);
                            Log.e("XML", "author == " + author + "parse == " + parser.getName());
    
                        }
                        break;
                    // XML文档的结束节点 如</entry> 3
                    case XmlPullParser.END_TAG:
    
                        if ("entry".equals(parser.getName())) {
                            Log.e("XML", "解析xml一个节点完成" + parser.getName());
    
                            // 处理完一个entry标签
                            list.add(bean);
                            bean = null;
                        }
                        break;
                }
                type = parser.next(); // 解析下一个节点
            }
            return list;
        }
    }
    
    

    在Activity中,

    private void pullParseXml(){
    
            final Message message = new Message();
            beanList = new ArrayList<>();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    try {
                        URL url = new URL("http://bbs.csdn.net/recommend_tech_topics.atom");
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setConnectTimeout(5000);
                        int code = conn.getResponseCode();
                        if (code == 200){
                            Log.e("XML","请求成功");
                            InputStream is = conn.getInputStream();
                            beanList = XMLService.getNewsInfo(is);
                            Log.e("XML",beanList.size()+ "");
    
                            // 成功获取数据 给主线程发消息
                            message.what = 3;
                            handler.sendMessage(message);
                        }
    
                    } catch (Exception e) {
                        // 获取数据失败,给主线程发消息,处理数据
                        message.what = 4;
                        handler.sendMessage(message);
    
                        e.printStackTrace();
                    }
    
                }
            }).start();
    
        }
    

    得到的数据:


    xml解析得到的数据

    二、Html解析

    数据源来自虎扑体育

    虎扑体育源码

    1)Jsoup

    Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    Jsoup的主要功能:

    1. 从一个 URL,文件或字符串中解析 HTML;
    2. 使用 DOM 或 CSS 选择器来查找、取出数据;
    3. 可操作 HTML 元素、属性、文本;

    Jsoup的中文文档

    ------注释写在代码里-----

    使用前需要导入Jsoup的jar包,复制jar包AndroidStudio中lib目录下并右键Add As Library。点击下载

    使用案例

     private void getDataByJsoup(){
    
            final NewsInfo newsInfo = new NewsInfo();
            final Message message = new Message();
            newsList.add(newsInfo);
    
            // 开启一个新线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // 网络加载HTML文档
                        Document doc = Jsoup.connect("https://voice.hupu.com/nba")
                                .timeout(5000) // 设置超时时间
                                .get(); // 使用GET方法访问URL
                        Elements elements = doc.select("div.list-hd");
                        for (Element element:elements){
    
                            String title = element.select("a").text(); // 新闻标题
                            String url = element.select("a").attr("href"); // 新闻内容链接
                            newsInfo.setTitle(title);
                            newsInfo.setNewsUrl(url);
                            Log.e("TAG","Jsoup ======>>" + title + url);
                        }
                        Elements elements1 = doc.select("div.otherInfo");
                        for (Element element: elements1){
    
                            String time = element.select("a").text(); // 时间
                            newsInfo.setNewsTime(time);
                            Log.e("TAG","Jsoup ======>>" + time );
    
                        }
    
                        message.what = 1;
    
                    } catch (IOException e) {
                        message.what = 2;
                        e.printStackTrace();
                    }
                    handler.sendMessage(message);
    
                }
            }).start();
    
        }
    

    获取的数据:

    Jsoup获取的数据

    相关文章

      网友评论

        本文标题:Android开发 - 抓取并解析网页数据(xml解析、html

        本文链接:https://www.haomeiwen.com/subject/ddonwxtx.html