博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nutch解析网页乱码解决方案
阅读量:6040 次
发布时间:2019-06-20

本文共 1712 字,大约阅读时间需要 5 分钟。

hot3.png

Nutch在使用默认网页解析插件解析网页文本时,有些网页会出现在乱码问题。

出现乱码的原因分析
parse-html插件在解析网页文本时,会先使用正则表达匹配出网页的编码。源码如下:
private static Pattern metaPattern =
    Pattern.compile("<meta\\s+([^>]*http-equiv=(\"|')?content-type(\"|')?[^>]*)>",
                    Pattern.CASE_INSENSITIVE);
 
  private static Pattern charsetPattern =
    Pattern.compile("charset=\\s*([a-z][_\\-0-9a-z]*)", Pattern.CASE_INSENSITIVE);
该 正则表达式只能匹配出使用<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />标明网页编码的网页。国内有些网站是使用<meta charset="utf-8" />来标明网页编码,因此插件无法解析出网页的编程。当无法解析出网页编码时,插件会使用nutch配置文件设置的默认解析编码。如果没有在 nutch-site.xml文件中配置默认解析网页的编码,程序会使用nutch-default.xml文件的默认配置。默认配置如下:
<property>
  <name>parser.character.encoding.default</name>
  <value>windows-1252</value>
  <description>The character encoding to fall back to when no other information
  is available</description>
</property>
默认编码是windows-1252,针对没有提取出网页编码的网页,解析出来的网页内容就是乱码了。
解决方法:
1、 针对在网页代码中使用<meta charset="utf-8" />标明网页编码的网站,在HtmpParser类中增加提取网页编码的代码。偶写的正则表达式是:
private static Pattern metaPaternOther = Pattern.compile("<meta\\s+([^>]*charset=\\s*(\"|')?\\s*([a-z][_\\-0-9a-z]*)(\"|')?[^>]*)>",Pattern.CASE_INSENSITIVE);
  private static Pattern charsetPatternOther =
Pattern.compile("charset=\\s*((\"|')?([a-z][_\\-0-9a-z]*))", Pattern.CASE_INSENSITIVE);
Java代码就不贴出来了,很简单的。
目前我还没有发现其它标注网页编码的方式,所以只写处理了这种情况的代码。如果有同学发现了其它形式,请也告诉我哈,我再完善一下代码。
2、 如果网页没有使用以上两种形式标明网页编码,那么可以在nutch-site.xml配置文件设置默认解析网页的编码为utf-8或者gb2312。Nutch会使用配置的默认编码解析网页,对于中文网站来说,主要是这两种编码。
<property>
  <name>parser.character.encoding.default</name>
  <value>utf-8</value>
  <description>The character encoding to fall back to when no other information is available</description>
</property>
经过这样处理,解析爬取的网页再没有出现乱码的现象了。

转载于:https://my.oschina.net/junfrank/blog/286911

你可能感兴趣的文章
HTML 表格
查看>>
VMware 虚拟化编程(7) — VixDiskLib 虚拟磁盘库详解之三
查看>>
php 未实例化类调用方法的问题
查看>>
我对读计算机软件专业硕士的几点看法
查看>>
用JS写CSS
查看>>
TOJ4537: n阶行列式
查看>>
3.16
查看>>
表单文件上传与文件下载
查看>>
下午考
查看>>
创建字符设备的三种方法
查看>>
走在网页游戏开发的路上(六)
查看>>
nginx 配置的server_name参数(转)
查看>>
Uva592 Island of Logic
查看>>
C++基础代码--20余种数据结构和算法的实现
查看>>
footer固定在页面底部的实现方法总结
查看>>
nginx上传文件大小
查看>>
HDU 2243 考研路茫茫——单词情结(自动机)
查看>>
Dubbo OPS工具——dubbo-admin & dubbo-monitor
查看>>
Dungeon Master ZOJ 1940【优先队列+广搜】
查看>>
Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
查看>>