版权声明:本文为博主原创文章,未经博主允许不得转载。
网页有两种格式,一种是xml另一种是html,目前似乎好像大部分都是html格式的,查看网页格式的方法是在浏览器中右键-->查看源码
一,XML解析的三大方法
(1) SAX: Simple API for XML
SAX是一个解析速度快并且占用内存少的XML解析器。SAX解析XML文件采用的是事件驱动,也就是它并不需要解析完整个文档,
在按内容顺序解析文档的过程中,SAX会判断当前读到的字符是否符合XML语法中的某部分,如果符合则触发事件其实就是一些回调函数,
这些方法定义在ContentHandler
(2)DOM:Document Object Model
DOM解析是将XML文件全部载入,组成一颗dom树,然后通过节点以及节点之间的关系来解析XML文件。
对于特别大的文档,解析和加载整个文档可能很慢且很耗资源。
(3)pull
Pull是Android内置的xml解析器。Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
二,HTML解析的三大方法
(1)Jsoup
(3)httpclient
HttpClient是一个很方便进行Http连接操作的工具包,用它可以设置代理和模拟浏览器下载网页。而HtmlParser则是一个开源的,可以对HTML进行处理的工具包,可以很方便的对HTML进行解析。
三,HttpClient源码讲解
本源码实现了抓取网页上的部分内容,并分栏显示出来,改进自laihuan99的博文Android抓取CSDN首页极客头条内容--网页数据抓取
MainActivity2.java
manifest.xml
最后写一点关于正则表达式的写法:
需要下载一个工具:RegexTester.exe下载
比如提取这一段源码中的新闻标题
共同的格式是这样的: 用(.*?)代替所需要的内容,于是在RegexTester.exe中输入下式能通过。(\2表示与第二个所需内容重复) 继续精简去掉无用的:通过说明一下,不好的正则表达式会严重地影响匹配时间从而影响你app的运行速度,要反复研究出最好的正则表达式以便让你的app更流畅。
jsoup的强大之处在这里就不多说,最近在写项目,需要爬取网页上的内容,自然想到的是利用Jsoup来处理,项目中是利用Jsoup爬取学校信息门户的新闻消息,然后放进客户端
网页的html代码如下
1
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
private static void getItemContent() {
// TODO Auto-generated method stub
Document doc ;
try {
doc = Jsoup.connect( "http://www.qfnu.edu.cnhttp://blog.csdn.net/html/xxyw/2016/09/02/d6f4656a-7349-4632-8634-27d30daaf3ad.html" ).get();
Elements listClass = doc.getElementsByAttributeValue( "class" , "zw_content" );
String url2;
for (Element listItem : listClass){
String url1 = listItem.getElementsByTag( "img" ).get( 0 ).attr( "src" );
try {
url2= listItem.getElementsByTag( "img" ).get( 1 ).attr( "src" );
} catch (Exception e){
url2= "1111" ;
}
String text = listItem.getElementsByTag( "span" ).text();
System.out.println(text);
System.out.println(url1);
System.out.println(url2);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
8 月30日,日照市常务副市长王斌一行人来我校进行调研。校长戚万学,副校长康淑敏、杨冰等热情接待了王斌一行。校区管理办公室、学生工作办公室等相关负责人参加了座谈。 王斌表示,曲阜师范大学有深厚的文化与学术底蕴,形成了独具特色的办学传统与学科优势,为服务日照、校地合作积极创造条件,建立校地资源共享、共同合作的良性渠道,为日照市社会发展做出了重要贡献,为日照市文化经济发展提供了支持,实现了社会建设的人才保障。 戚万学对日照市委市政府给予的支持和帮助表示了感谢,并表明我校将进一步提高办学层次、加强人才培养,大力促进校地、校企合作,为日照市输送更多的优秀人才,实现学校建设与社会发展的共赢。我们将本着资源共享、互惠共赢的原则,以项目(课题)为纽带、整合学科资源、发挥人才优势与日照市加强合作和交流,为新丝绸之路经济带建设与发展做出贡献。 ( 作者:李艳梅? 来源:校区管理办公室? 编辑:校区管理办公室? 责编:孙琪)
/uploadfile/2016/0905/20160905095553545.jpg //第一个图片的超链接
1111 //如果没有第二个图片,侧打印自定义的URl
同样需要爬取到html代码中的新闻标题,图片超链接,由于图片的超链接跟标题跟文章内容的url不在一个标签下,所以在Elements节点需要向上抽取一层,在内层分别做不同的处理
java代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
private static void getContent() {
// TODO Auto-generated method stub
Document doc;
try {
doc=Jsoup.connect( "http://www.qfnu.edu.cn/" ).get();
Elements listClass = doc.getElementsByAttributeValue( "class" , "news-1-lists" );
for (Element listElement : listClass){
Elements listName = listElement.getElementsByTag( "li" );
for (Element element : listName){
//img标签下的数据
String title =element.getElementsByTag( "img" ).attr( "title" );
String url =element.getElementsByTag( "img" ).attr( "src" );
//文章链接在a标签下,需要单独处理
String content = element.getElementsByTag( "a" ).attr( "href" );
System.out.println(title+ "http://www.qfnu.edu.cn" +url+ "文章地址" +content);
}
}
// System.out.println(listClass);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
|
爬取的结果如下
我校在山东高校思政课讲课大赛中斩获佳绩http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095553241.jpg文章地址http://blog.csdn.net/html/xxyw/2016/09/02/4648a396-c778-4116-ae79-6e61039ad9a3.html
日照市常务副市长王斌一行来我校调研http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095553545.jpg文章地址http://blog.csdn.net/html/xxyw/2016/09/02/d6f4656a-7349-4632-8634-27d30daaf3ad.html
我校与济宁高新区签署共建大学生创业孵化基地协议http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554664.jpg文章地址http://blog.csdn.net/html/xxyw/2016/09/01/b457fe77-7bdc-4430-a7a2-d58e4c1101bf.html
学校对科研实验室安全检查工作做出部署http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554660.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/31/a0ead4f5-79fe-4e7c-bdf7-4fef9336de30.html
学校领导深入各单位检查新学期开学工作http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554357.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/30/d77063c3-8c70-4386-be04-4cb806856332.html
我校在全国高等院校健身气功赛中获佳绩http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554406.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/30/056dfcb5-ca75-495e-a103-fe426f0a9ff4.html
校长戚万学会见新西兰客人http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554528.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/30/aa9a0b89-2487-4a8b-ae18-bae1b54facae.html
我校学生在全国大学生物理教学技能展示中获骄人成绩http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554175.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/29/4698415f-0656-42de-a2d5-3e339f721840.html
2016年算子代数研讨会召开http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554399.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/29/e378f047-0a90-4a4b-87f1-0154adfdbf62.html
我校2016年暑期干部学习班成功举行http://www.qfnu.edu.cn/uploadfile/2016/0905/20160905095554314.jpg文章地址http://blog.csdn.net/html/xxyw/2016/08/28/95986304-7e98-4f5c-942b-30d551f5d4b2.html
现在网上流行了一种自由开发者的风气;就是自己私下写一个简易的app上传到github上;可以以此项目作为开源;同时熟悉git操作;但是很多时候我们都需要一些数据来呈现在app中;如图片列表,如文字+图片列表;网上有很多开放式的api可以调用,如百度api、http://gank.io/api(干货集中营api);如果你现在想弄自己的一套数据,想把一些网站的数据整合过来使用,那就需要去抓取某些网页中的特定数据;
我们是通过Jsoup来抓取数据的;jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容;
关于Jsoup的介绍,请访问Jsoul的官网:http://jsoup.org/
关于Jsoup的jar包下载地址:http://jsoup.org/download
关于Jsoup的官网API文档查询:http://jsoup.org/apidocs/
这里:http://www.open-open.com/jsoup/
AndroidStudio中把jar包放入libs文件下;右键add as a libr...后就可以使用了;废话不多说,这里就是讲怎么通过Jsoup去抓取网页特定数据;
比如这里我们需要抓取泡在网上的日子中安卓开发里面文章的标题+图片+详情链接;
直接右键显示网页源码(或者F12);我们可以看到很多HTML+CSS标签等;
我们直接在里面快速找到我们需要的标题(如:Realm for Android快速入门教程、Android 6.0状态栏使用灰色文字和图标);之后我们需要分析是从什么节点开始才是一条数据;就好比数组[{},{}]一样;里面每个数据都是以什么开头的;这里我们分析之后可以看到是以