Android开发
来源:互联网 发布:纽约跑跑美国代购 知乎 编辑:程序博客网 时间:2024/06/10 20:05
参考: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(); }
得到的数据:
二、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(); }
获取的数据:
- android 开发
- Android 开发
- Android 开发
- android开发
- android开发
- android开发
- Android开发
- Android开发
- Android开发
- android开发
- android开发
- Android 开发
- Android开发
- Android 开发
- Android 开发
- Android开发
- android 开发
- android 开发
- (十)java锁机制深度化
- 9---------栈和队列的应用
- C++11之多线程初探
- 利用myeclipse自带的功能实现webservice
- OCR图像识别技术的JAVA实现(二)之Tess4J的使用
- Android开发
- android getApplicationContext()强制转换为自定义的application时崩溃的原因
- 现在!立刻!马上!
- AOP简介
- Android外接midi设备的录音
- 修改VirtualBox虚拟机默认存储路径及虚拟机迁移方法
- out与ref
- [ZJOI2005]沼泽鳄鱼 矩乘dp
- 多校联训日记