使用perl脚本抓取网页总结

十二月 29th, 2009

使用perl实现网页抓取,对网络蜘蛛的初步尝试。

环境

windows xp,IIS,perl 5.88,CMD

使用到的模块

use LWP::Simple; 用来得到网页
use HTML::HeadParser; 对部分进行解析,得到标题、编码、关键词等
use HTML::FormatText::WithLinks; 将html变成文本可读样式
use Encode qw/encode decode/; 解决不同网页的编码问题

需求

在CMD中调试,最后IIS中调用,解析结果要保存到数据库中,数据库中采用utf8编码,解析的网页为gb2312编码,所以理清编码特别重要。

关于编码首先应该弄清楚的概念

  • Perl字符串是使用utf8编码的,也就是说读进perl的字符的编码格式都是utf8;
  • 读取输入时,perl会自动将其转换为urf8,输出时的编码依据运行环境已经上下游环境。

乱码问题

脚本使用ANSI编码,只是数据库的内容使用decode,结果内容有个别字符乱码,是HTML::FormatText::WithLinks; 将html变成文本可读样式时出现问题。可以算是一个bug

解决方法

脚本实用utf8编码,得到的网页首先进行decode,再进行其他的处理,问题解决,但在cmd下调试的时候,会有“Wide character in print”警告信息,因为环境是gbk,输出urt8编码是会报警,使用encode(”euc-cn”, $value),对输出进行转义,可以解决这个问题,而网上说的加 use encoding “utf-8″; 不能解决这个问题。

其他需要注意的问题

  • 调用匹配的内容再去匹配其他内容时,注意对该内容的元字符进行转义;
  • 入库的内容也要进行转义;

遗留问题:IIS对perl的支持,配置没有问题,增加了对.pl、.cgi的定义,测试时发现在IE下正常,在firefox下弹出保存文件的对话框,但是以前的.pl正常。估计于haed的输出有关系,还有待于进一步的测试。

encode、decode函数说明

encode函数是用来编码Perl字符串的。它将Perl字符串中的字符用指定的编码格式编码,最终转化为字节流的形式,因此和Perl处理环境之外的事物打交道经常需要它。

其格式很简单:

$octets = encode(ENCODING, $string [, CHECK])

$string:  Perl字符串

encoding: 是给定的编码方式

$octets:  是编码之后的字节流

check:   表示转换时如何处理畸变字符(也就是Perl认不出来的字符)。一般不需使用

decode函数则是用来解码字节流的。它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。它的格式为:

$string = decode(ENCODING, $octets [, CHECK])
$string、ENCODING、$octets和CHECK的含义同上。

明白如何使用该函数的例子:

use Encode;
$dat="测试文本";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"\n";
}

Entry Filed under: program

Leave a Reply

You must be logged in to post a comment.

 

2009年十二月
« 十一   一 »
 123456
78910111213
14151617181920
21222324252627
28293031  

分类目录

标签

书签 优化 参数 命令 啪嗒砰 域名 备份 字体 安装 导入 导出 扩展 换行 文字 正则 爬虫 解决办法 路径 道具 错误 镜像 19楼 Apache awk AWstats CentOS CPAN EditPlus Firefox GD GeoIP Google IBM Linux mysql OUTLOOK Patapon perl photoshop PHP profile rsync sed Shell Thunderbird

最近文章

最近评论

文章索引模板

功能

SEO Powered by Platinum SEO from Techblissonline