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>经过这样处理,解析爬取的网页再没有出现乱码的现象了。