`

Nutch1.6解析网页乱码解决方案

阅读更多

Nutch1.6在使用默认网页解析插件解析网页文本时,有些网页会出现在乱码问题。
出现乱码的原因分析
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>
经过这样处理,解析爬取的网页再没有出现乱码的现象了。我使用nutch版本是1.6,其它版本没有测试过。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics