之前提到过,对于简单的网页结构解析,可以直接通过观察法、手工写正则解析,可以做出来,比如网易微博。但是对于结构稍微复杂点的,比如新浪微博,如果还用正则,用眼睛一个个去找,未免太麻烦了。

本文介绍两个工具包:解析html, xml的jsoup,和读写xml的dom4j。

工具包jsoup是解析html、xml的利器,利用jsoup可以快速读取html等规范文档格式的节点数据,比正则解析省事多了,而且自己写正则容易考虑不周导致潜在bug,也很容易出错。

同时我们提取出来的微博数据直接存在txt文档里显得结构层次不太清晰,也可以以xml的形式输出,自定义节点,当然首先是得对xml格式有所了解,写xml文件有个工具包dom4j。

下面仅仅给出这两个工具包在这个微博爬虫项目中使用的例子,其实这两个强大的工具包还有其他很多的用法,更多的应用详见官方说明文档。

一、jsoup解析HTML

Jsoup是一个基于java的html解析器,可直接解析某个URL地址、HTML文本内容,其提供的API可以通过DOM, CSS,类jQuery的操作方法读取和操纵数据。

Jsoup主要功能:

1.从一个url、文件或字符串解析html。

2.使用DOM或CSS选择器查找、取出数据。

3.可以操作HTML的元素、属性、文本。

当然jsoup比其他解析器更有优势的地方就是它的选择器功能,很多解析只要一行代码就搞定,而用其他工具包至少都要写很多行。选择器操作比如doc.select(“a[herf]”);选择器select可以选择你想要的任何元素。

在本项目中的代码:

	public String parse(String html) {
String s = "";
Document doc = Jsoup.parse(html);
Elements userNames = doc.select("dt[class].face > a");
Elements userids = doc.select("span > a[action-data]");
Elements dates = doc.select("a[date]");
Elements tweetids = doc.select("dl[mid]");
Elements tweets = doc.select("p > em");
Elements forwardNums = doc.select("a:contains(转发)");
Elements commentNums = doc.select("a:contains(评论)");
for(Element userName : userNames) {
String attr = userName.attr("title");
s += "<userName> " + attr + " </userName>";
}
for(Element userid : userids) {
String attr = userid.attr("action-data");
attr = attr.substring(attr.indexOf("uid="));
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(attr);
if(m.find()) {
attr = m.group();
}
s += "<userid> " + attr + " </userid>";
}
for(Element date : dates) {
String attr = date.text();
s += "<date> " + attr + " </date>";
}
for(Element tweetid : tweetids) {
String attr = tweetid.attr("mid");
s += "<tweetid> " + attr + " </tweetid>";
}
for(Element tweet : tweets) {
String attr = tweet.text();
s += "<tweetSentence> " + attr + " </tweetSentence>";
}
for(Element forwardNum : forwardNums) {
String attr = forwardNum.text();
if(attr.equals("转发")) {
attr = "0";
}
else {
if(!attr.contains("转发(")) {
attr = "0";
}
else {
attr = attr.substring(attr.indexOf("转发(")+3, attr.indexOf(")"));
}
}
System.out.println(attr);
s += "<forwardNum> " + attr + " </forwardNum>";
}
for(Element commentNum : commentNums) {
String attr = commentNum.text();
if(attr.equals("评论")) {
attr = "0";
}
else {
if(!attr.contains("评论(")) {
attr = "0";
}
else {
attr = attr.substring(attr.indexOf("评论(")+3, attr.indexOf(""));
}
}
System.out.println(attr);
s += "<commentNum> " + attr + " </commentNum>";
}
//System.out.println(s);
return s;
}

二、dom4j写出微博数据到xml

在本项目中的代码:

	public void writeVector2xml(Vector<String> vector, String saveXMLPath) throws IOException {
int vectorSize = vector.size();
String oneIniTweet;
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GB2312"); //xml被识别格式仅为gb2312,默认utf8不被识别
File f = new File(saveXMLPath);
f.createNewFile(); //先建立一个空xml文件
FileWriter fw = new FileWriter(f);
org.dom4j.Document document = DocumentHelper.createDocument(); //建document对象实例
org.dom4j.Element rootElement = document.addElement("tweets"); //节点增加方法
rootElement.addAttribute("totalNumber", String.valueOf(vectorSize)); //设置属性
for(int j=0; j<vectorSize; j++) {
oneIniTweet = vector.get(j);
String userName = oneIniTweet.substring(oneIniTweet.indexOf("<userName> "), oneIniTweet.indexOf(" </userName>"));
String userId = oneIniTweet.substring(oneIniTweet.indexOf("<userName> "), oneIniTweet.indexOf(" </userName>"));
String prettyTime = oneIniTweet.substring(oneIniTweet.indexOf("<userName> "), oneIniTweet.indexOf(" </userName>"));
String tweetSentence = oneIniTweet.substring(oneIniTweet.indexOf("<tweetSentence> "), oneIniTweet.indexOf(" </tweetSentence>"));
org.dom4j.Element tweetElement = rootElement.addElement("tweet");
tweetElement.addAttribute("userName", userName);
tweetElement.addAttribute("userId", userId);
tweetElement.addAttribute("prettyTime", prettyTime);
tweetElement.setText(tweetSentence); // 设置节点文本内容
}
XMLWriter xw = new XMLWriter(fw, format);
xw.write(document);
xw.close();
}

写出的xml的结果:

原创文章,转载请注明出处:http://blog.csdn.net/dianacody/article/details/39716637

【网络爬虫】【java】微博爬虫(四):数据处理——jsoup工具解析html、dom4j读写xml的更多相关文章

  1. Java从零开始学四十二(DOM解析XML)

    一.DOM解析XML xml文件 favorite.xml <?xml version="1.0" encoding="UTF-8" standalone ...

  2. Java从入门到精通——技巧篇之利用dom4j取出XML文件中的数据

    在我们做项目的时候会经常用到XML文件用来配置系统,XML让系统更加的具有了灵活性,Java如何从XML中取出我们想要的数据呢?下面是我利用DOM4J来实现取出XML文件中的数据. XML文件 < ...

  3. Java实现——Dom4j读写XML文件

    1. dom4j概述 解析DOM4J是一个开源XML解析包,采用了Java集合框架并完全支持DOM,SAX和JAXP. 最大的特色是使用了大量的接口,主要接口都在org.dom4j里定义. 2. do ...

  4. java dom4j 读写XML

    <?xml version="1.0" encoding="UTF-8"?> <Configuration> <Config id ...

  5. 【网络爬虫】【java】微博爬虫(二):如何抓取HTML页面及HttpClient使用

    一.写在前面 上篇文章以网易微博爬虫为例,给出了一个很简单的微博爬虫的爬取过程,大概说明了网络爬虫其实也就这么回事,或许初次看到这个例子觉得有些复杂,不过没有关系,上篇文章给的例子只是让大家对爬虫过程 ...

  6. 微博爬虫,python微博用户主页小姐姐图片内容采集爬虫

    python爬虫,微博爬虫,需要知晓微博用户id号,能够通过抓取微博用户主页内容来获取用户发表的内容,时间,点赞数,转发数等数据,当然以上都是本渣渣结合网上代码抄抄改改获取的! 要抓取的微博地址:ht ...

  7. 【网络爬虫】【java】微博爬虫(五):防止爬虫被墙的几个技巧(总结篇)

    爬虫的目的就是大规模地.长时间地获取数据,跟我们正常浏览器获取数据相比,虽然机理相差不大,但总是一个IP去爬网站,大规模集中对服务器访问,时间一长就有可能被拒绝.关于爬虫长时间爬取数据,可能会要求验证 ...

  8. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)

    一.写在前面 (本专栏分为"java版微博爬虫"和"python版网络爬虫"两个项目,系列里所有文章将基于这两个项目讲解,项目完整源码已经整理到我的Github ...

  9. Golang 网络爬虫框架gocolly/colly 四

    Golang 网络爬虫框架gocolly/colly 四 爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟.回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫, ...

随机推荐

  1. 每天进步一点点——mysql——Percona XtraBackup(innobackupex)

    一.  简单介绍 Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB存储引擎的数据库非堵塞地备份(对于MyISAM的备份相同须要加表锁).Xt ...

  2. About me --- Connecting the dots

    在这个难以入眠的夜里,乔布斯年在斯坦福的演讲里说的“Connecting the dots”又萦绕耳际,即当我们往回看,就清楚了 自己曾经的生活和现在甚至将来是串联在一起的,这些经历决定了我们事业.生 ...

  3. mac下执行文件出现Permission Denied的解决

    mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读.写.可执行,你这个文件没有可执行权限,需要加上可执行权限. 1. 终端下先 cd到该文件的目录下 2 ...

  4. java transient关键字(转载)

    博客来源:http://www.blogjava.net/fhtdy2004/archive/2009/06/20/286112.html Volatile修饰的成员变量在每次被线程访问时,都强迫从主 ...

  5. commons.cli.jar 作用

    对命令行进行处理的jar包.处理的步骤主要包括定义.分析和询问.(There are three stages to command line processing. They are the def ...

  6. 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)

    [BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...

  7. 【BZOJ1844/2210】Pku1379 Run Away 模拟退火

    [BZOJ1844/2210]Pku1379 Run Away 题意:矩形区域中有一堆点,求矩形中一个位置使得它到所有点的距离的最小值最大. 题解:模拟退火的裸题,再调调调调调参就行了~ #inclu ...

  8. 公网RTSP地址(持续更新)

    H264+AAC: rtsp://a2047.v1412b.c1412.g.vq.akamaistream.net/5/2047/1412/1_h264_350/1a1a1ae555c53196016 ...

  9. wait()和notify()

    从https://www.cnblogs.com/toov5/p/9837373.html 可以看到他的打印是一片一片的,这边博客介绍怎么避免掉 使用notify 和 wait的时候 要注意 是在sy ...

  10. centos6.5安装jdk

    1.查看Linux环境自带JDK 使用命令:# rpm -qa|grep gcj 显示内容其中包含相应信息# java-x.x.x-gcj-compat-x.x.x.x-xxjpp# java-x.x ...