版权声明:本文为博主原创文章,未经博主允许不得转载。
网页有两种格式,一种是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表示与第二个所需内容重复) 继续精简去掉无用的:通过再多试试去掉其它的杂草: 最后用\\s代替换行,并在每个"前加\ 这就是最好的形态,
说明一下,不好的正则表达式会严重地影响匹配时间从而影响你app的运行速度,要反复研究出最好的正则表达式以便让你的app更流畅。
====================================================================================
jsoup的强大之处在这里就不多说,最近在写项目,需要爬取网页上的内容,自然想到的是利用Jsoup来处理,项目中是利用Jsoup爬取学校信息门户的新闻消息,然后放进客户端
网页的html代码如下
1
|
<span style=
"LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 16px"
>
8
</span><span style=
"LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 16px"
>月
30
日,日照市常务副市长王斌一行人来我校进行调研。校长戚万学,副校长康淑敏、杨冰等热情接待了王斌一行。校区管理办公室、学生工作办公室等相关负责人参加了座谈。</span><p></p><p style=
"LINE-HEIGHT: 150%; TEXT-INDENT: 32px"
><span style=
"LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 16px"
>王斌表示,曲阜师范大学有深厚的文化与学术底蕴,形成了独具特色的办学传统与学科优势,为服务日照、校地合作积极创造条件,建立校地资源共享、共同合作的良性渠道,为日照市社会发展做出了重要贡献,为日照市文化经济发展提供了支持,实现了社会建设的人才保障。</span></p><p style=
"LINE-HEIGHT: 150%; TEXT-INDENT: 32px"
><span style=
"LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 16px"
>戚万学对日照市委市政府给予的支持和帮助表示了感谢,并表明我校将进一步提高办学层次、加强人才培养,大力促进校地、校企合作,为日照市输送更多的优秀人才,实现学校建设与社会发展的共赢。我们将本着资源共享、互惠共赢的原则,以项目(课题)为纽带、整合学科资源、发挥人才优势与日照市加强合作和交流,为新丝绸之路经济带建设与发展做出贡献。</span></p><p style=
"LINE-HEIGHT: 150%; TEXT-INDENT: 32px"
><span style=
"LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 16px"
>(</span><span style=
"LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; FONT-SIZE: 16px"
>作者:李艳梅 来源:校区管理办公室 编辑:校区管理办公室 责编:孙琪)</span></p><p></p>
|
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
{
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(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
====================================================================================
作者 lieco 2015.12.31 14:32
写了9848字,被4人关注,获得了10个喜欢
Android自由开发者 通过Jsoup抓取网页数据
现在网上流行了一种自由开发者的风气;就是自己私下写一个简易的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状态栏使用灰色文字和图标);之后我们需要分析是从什么节点开始才是一条数据;就好比数组[{},{}]一样;里面每个数据都是以什么开头的;这里我们分析之后可以看到是以<div class="archive-list-item">为节点就是一条数据;我们需要的详情连接是在<div class="archive-list-item">层下第一个标签<a href>中;图片地址是在第二个标签<img>中, 我们需要的标题是在<div class="post-intro">层下的子标签里面;
我们所需要的东西已经找到;接下来我们去抓取出数据封装一下就可以用了;
代码如下:
可以看到先是通过Jsoup.connect(url).get();获取一个Document;这样我们就可以通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据;首先解析我们上面说的节点<div class="archive-list-item">会得到一个Elements 通过for循环;我们在循环中取我们需要的数据;看代码可以发现Elements的两个属性select和attr;select可以认为是提取<XXX这种标签;attr可以是认为提取XXX的内容;如:e.select("img").attr("src")) 就是提取标签img下面的src对应的内容;我们运行打印一下数据可以看到下面的结果:
可以看到我们需要的数据已经打印出来了;
接着我们就是接收跟封装数据了,毕竟我们习惯了后台服务器返回的那种json数据;接下来写一个简易的Bean类如下:
里面序列化的代码没截全;把上面代码改下改掉;顺便加上分页功能:
这样我们就能愉快地使用List<Object>数据了;
最后特此声明:用了泡在网上的日子的数据;