首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

由nutch readseg -dump 中文编码乱码想到的…

2012-08-17 
由nutch readseg -dump 中文编码乱码想到的……两周前,我参考Hadoop权威指南2,写了一个读取SequenceFile的类

由nutch readseg -dump 中文编码乱码想到的……

两周前,我参考Hadoop权威指南2,写了一个读取SequenceFile的类,想读取Nutch抓取下来的segments文件。当时如果Nutch抓取的是utf8编码的中文页面就可以正常读取,但如果网页是中文编码的话就会出现乱码,比如我抓取了www.163.com,用

?

bin/nutch crawl urls/ -dir crawl/www.163.com/ -depth 3 -topN 50 -thread 5

?

?由于163是用的gb2312编码的,读取crawl/www.163.com/segments/下面的文件就有乱码。同样可以用readseg一试

?

 bin/nutch readseg -dump crawl/www.163.com/segments/20120513192613/ crawl/www.163.com/readseg-result1

?

?查看readseg-result1/dump文件发现Content::中的网页源码信息中的中文是乱码,但观察其上方的ParseData::和ParseText::却不是乱码,于是我看了Nutch的readseg命令的源代码:org.apache.nutch.segment.SegmentReader

?

找到其map和reduce方法,想进行改造重新实现一个MySegmentReader,在map方法:

?

public void map(WritableComparable key, Writable value, OutputCollector<Text, NutchWritable> collector,Reporter reporter) throws IOException {// convert on the fly from old formats with UTF8 keys.// UTF8 deprecated and replaced by Text.if (key instanceof Text) {newKey.set(key.toString());key = newKey;}collector.collect((Text) key, new NutchWritable(value));}

?和reduce方法:

?

public void reduce(Text key, Iterator<NutchWritable> values, OutputCollector<Text, Text> output, Reporter reporter)throws IOException {StringBuffer dump = new StringBuffer();dump.append("\nRecno:: ").append(recNo++).append("\n");dump.append("URL:: " + key.toString() + "\n");while (values.hasNext()) {Writable value = values.next().get(); // unwrapif (value instanceof CrawlDatum) {dump.append("\nCrawlDatum::\n").append(((CrawlDatum) value).toString());} else if (value instanceof Content) {dump.append("\nContent::\n").append(((Content) value).toString());} else if (value instanceof ParseData) {dump.append("\nParseData::\n").append(((ParseData) value).toString());} else if (value instanceof ParseText) {dump.append("\nParseText::\n").append(((ParseText) value).toString());} else if (LOG.isWarnEnabled()) {LOG.warn("Unrecognized type: " + value.getClass());}}output.collect(key, new Text(dump.toString()));}

?我尝试了多种转换编码的方式,然后重新执行MySegmentReader,却总是得到同样的结果Content::中的网页源码信息中的中文始终是乱码。

?

我想为什么不直接用ParseText::中的编码正确的信息呢?

根据reduce中

?

 else if (value instanceof ParseText) {dump.append("\nParseText::\n").append(((ParseText) value).toString());}

?的提示,我想可以重新写一个解析类的reduce方法,专门用于生成这种纯文本的ParseText的文件,然后交给Mahout的org.apache.mahout.text.SequenceFilesFromDirectory类去处理。

?

今天我又用之前写的读取SequenceFile的类来读取了crawl/www.163.com/segments/20120513192613/parse_text/part-00000/data的信息,就是正常的无乱码的文本:

bin/hadoop jar ~/Desktop/SequenceFileReader.jar segments/20120513192613/parse_text/part-00000/data segdata-parse-text

?产生的结果如下:

[7261*]??? http://news.163.com/12/0511/16/8183GF9B0001124J.html??? 坚持开拓创新 勇立时代潮头_网易新闻中心 网易首页 - 新闻 - 体育 - NBA - 娱乐 - 财经 - 股票 - 汽车 - 科技 - 手机 - 女人 - 论坛 - 视频 - 健康 - 房产 - 家居 - 教育 - 读书 - 游戏 - 彩票 - 车险 | 免费邮箱 - 通行证登录 | 微博 rss 网易 > 新闻中心 > 国内新闻 > 正文 新闻 网页 坚持开拓创新 勇立时代潮头 2012-05-11 16:09:29 来源: 中国青年网   有 0 人参与 手机看新闻 第十六届“中国青年五四奖章”获得者、国家海洋局北海分局潜航员付文韬在接受作为一名合格潜航员必须经历的“蛙人”训练。(图片来源:中国青年网) “把公厕变成家”,全国道德模范李影的创新理念使得小小。。。。内容太多。。。 发现者 】 香港自来水:源自内地,媲美欧盟 【 数 读 】 现代中国造像热,又一个世界第一 【 当事人 】 有毒食品网吴恒:希望不要把网站关了 【 军情观察室 】 黄岩岛争端:海洋意识曾经缺失的阵痛 看客 一周图片:5.5.-5.11 澳门的诱惑 新闻专题 网易新闻频道招聘 2012年法国大选 巴基斯坦客机坠毁 朝鲜发射人造卫星失败 网易新闻中心招聘 hao123—全新上网导航 博客 | 论坛 中国历次边境作战的前奏

?

?

?

?

?

?

?

?

?

?

?

?

?

热点排行