免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 37002 | 回复: 70
打印 上一主题 下一主题

奔溃中,请教一个关于perl脚本模式匹配的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-07-24 18:40 |显示全部楼层 |倒序浏览
本帖最后由 yhyhh 于 2011-07-26 12:22 编辑

小女子编写了一段perl脚本,来调用 "http://www.ip138.com:8080/search.asp" 进行 手机号码归属地查询。包含查询结果的网页内容被存入一个字符串中,本人期望只提取手机号码归属地这一项字串,不知道如何实现关于这段字符串的模式匹配。忘高手指教!多谢多谢!

1. 程序源文件
************************************************************
             test_ipcheck_v3.pl
************************************************************
#!/usr/bin/perl -w
use warnings;
use URI;
use LWP;
use Encode;
#用法 ip138search.pl iplist.txt
#以iplist.txt为参数,传入给变量$filename
my $filename=$ARGV[0];
open(FILE,$filename) || die "faile";
my $line = '0';
while($line=<FILE>){
chomp($line);
my $url=URI->new('http://www.ip138.com:8080/search.asp');
$url->query_form('mobile' => $line);
my $browser = LWP::UserAgent->new;
my $response = $browser->get($url);
if($response -> is_success) {
$value = $response -> decoded_content;
#中文解码
$out = encode("gb2312",$value);
}
else {
die $response -> status_line;
}
#M模式匹配
$str = $out;
$str =~ m/您查询的手机号码段:\s*/;
print "$line \n";
#print "$str";
}
close(FILE);
************************************************************


2. 当前程序运行情况:
************************************************************
C:\MyPractice\Perl>Test_ipcheck_v3.pl mobilelist_v1.txt
1340001
************************************************************


3. 期望程序运行情况:
************************************************************
C:\MyPractice\Perl>Test_ipcheck_v3.pl mobilelist_v1.txt
1340001 江苏 无锡
************************************************************


4. 个人理解的备注:
************************************************************
a. 这段代码的问题出在模式配置,不知道如何修改才好。求高手赐教!不甚感激!
b. 程序中变量out为包含查询结果的网页内容的xml格式信息,而本人希望提取的是下面table中号码归属地的相关信息,希望能够与这一段信息进行模式匹配,然后作为运行结果输出

<TABLE width=349 border="1" align="center" cellpadding="4" bordercolor=#3366cc style="border-collapse: collapse">
        <TR>
                <TD colspan=2 class=tdc1 align=center height=24 bgcolor=#6699cc>++ ip138.com查询结果 ++</TD>
        </TR>
        <TR class=tdc bgcolor=#EFF1F3>
                <TD width="130" align="center" noswap>您查询的手机号码段</TD>
                <TD width=* align="center" class=tdc2>1340001</TD>
        </TR>
        <TR class=tdc bgcolor=#EFF1F3>
                <TD align="center">卡号归属地</td><!-- <td width="130" align="center">卡号归属地</TD> -->
<TD class="tdc2" align="center">江苏&nbsp;无锡</TD>
        </TR>
        <TR class=tdc bgcolor=#EFF1F3>
<!-- <td width="130" align="center" noswap></td> --><TD width="130" align="center" noswap>卡&nbsp;类&nbsp;型</td><td align="center" class='tdc2'>移动全球通卡</TD>
        </TR>
        <TR class=tdc bgcolor=#EFF1F3>
                <TD align="center">区 号</TD>
<!-- <td></td> --><TD align="center" class=tdc2>0510</TD>
        </TR>
        <TR class=tdc bgcolor=#EFF1F3>
                <TD align="center">邮 编</TD>
                <TD align="center" class=tdc2>214000 <a href="http://alexa.ip138.com/post/" target="_blank">更详细的..</a></TD></TR>
</TABLE>

论坛徽章:
0
2 [报告]
发表于 2011-07-24 22:16 |显示全部楼层
没看你的模式匹配,但你最后print $line; 岂不是只把iplist.txt里的的值输出来了!
txh_zyy 发表于 2011-07-24 19:36



   谢谢大侠回复,iplist.txt中的值其实就是输入的想要查询的号码段,这个号码段 + 号码归属地 就是小女子期望的程序运行输出结果了。

这里再补充追问一句,如果print 那个语句改成这样子呢?目前按照执行情况来说,print语句改或不改,执行结果都是一样的。

哎,那个号码归属地,不知道怎么样才能把它正确地解析并且输出出来。

print "$line $1 \n";

论坛徽章:
0
3 [报告]
发表于 2011-07-25 20:56 |显示全部楼层
本帖最后由 yhyhh 于 2011-07-25 20:58 编辑
这个可以达到你的要求,使用 Web::Scraper 来解码网页吧,会容易多了,妹子,想了解这个可以看  这个中使用 ...
iakuf 发表于 2011-07-24 23:21


小女子试了大侠介绍的方法,用web::Scraper, 执行结果如下:

C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Can't locate Web/Scraper.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:\MyPractice\Perl\Test_ipcheck_v
5.pl line 6.
BEGIN failed--compilation aborted at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.

看起来是否我的perl安装文件里缺少了某些类库了呢?我的电脑系统是windows 7.0, 装的是activePerl.  version =  ActivePerl-5.14.1.1401-MSWin32-x86-294969.

论坛徽章:
0
4 [报告]
发表于 2011-07-25 21:38 |显示全部楼层
本帖最后由 yhyhh 于 2011-07-25 21:42 编辑
妹子,到cpan上把这个模块找到,装上!或者用cpanm装
txh_zyy 发表于 2011-07-25 20:59



    目前我找到的:
http://search.cpan.org/~miyagawa ... /lib/Web/Scraper.pm
这个地方的 “Web-Scraper-0.34”, 下载下来了,然后怯怯地说,有点不知所措啊。

我把它放到了这个目录下:

C:\MyPractice\Web-Scraper-0.34.
perl 的安装目录是: C:\MyPractice\Perl\.

然后运行了一下C:\MyPractice\Web-Scraper-0.34\Makefile.pl, 似乎生成了一些新文件。
同时在这个目录 "C:\MyPractice\Web-Scraper-0.34\lib\Web\" 下,我找到了 Scraper.pm。 接下来怎么办呢?直接把文件拷贝到 perl的目录: C:/Perl/lib 下面吗?

论坛徽章:
0
5 [报告]
发表于 2011-07-25 21:47 |显示全部楼层
更新最新进展啊。

我把目录 C:\MyPractice\Web-Scraper-0.34\lib\Web  CP成 C:\Perl\lib\Web.

第一个报错解决了,现在运行pl文件,显示如下结果:

C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Can't locate HTML/TreeBuilder/XPath.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/lib/Web/Scrape
r.pm line 10.
BEGIN failed--compilation aborted at C:/Perl/lib/Web/Scraper.pm line 10.
Compilation failed in require at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.
BEGIN failed--compilation aborted at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.

C:\MyPractice\Perl>

论坛徽章:
0
6 [报告]
发表于 2011-07-25 21:55 |显示全部楼层
如法炮制,这个问题也解决了,进一步更新最新进展。

C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Can't locate XML/XPathEngine.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/lib/HTML/TreeBuilder/
XPath.pm line 103.
BEGIN failed--compilation aborted at C:/Perl/lib/HTML/TreeBuilder/XPath.pm line 103.
Compilation failed in require at C:/Perl/lib/Web/Scraper.pm line 10.
BEGIN failed--compilation aborted at C:/Perl/lib/Web/Scraper.pm line 10.
Compilation failed in require at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.
BEGIN failed--compilation aborted at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.

C:\MyPractice\Perl>

接着找库文件去~~~~

论坛徽章:
0
7 [报告]
发表于 2011-07-25 21:56 |显示全部楼层
难道真的要这样子一个一个添加吗?有点疑惑了?

论坛徽章:
0
8 [报告]
发表于 2011-07-25 22:05 |显示全部楼层
好吧,精卫填海,麻雀筑巢中~~~,一个一个地补充库文件。是这样子的吗?

是不是重新换个activeperl的安装文件会好一些呢?


C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Can't locate XML/XPathEngine.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/lib/HTML/TreeBuilder/
XPath.pm line 103.
BEGIN failed--compilation aborted at C:/Perl/lib/HTML/TreeBuilder/XPath.pm line 103.
Compilation failed in require at C:/Perl/lib/Web/Scraper.pm line 10.
BEGIN failed--compilation aborted at C:/Perl/lib/Web/Scraper.pm line 10.
Compilation failed in require at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.
BEGIN failed--compilation aborted at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.

C:\MyPractice\Perl>
C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Can't locate HTML/Selector/XPath.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/lib/Web/Scraper.p
m line 11.
BEGIN failed--compilation aborted at C:/Perl/lib/Web/Scraper.pm line 11.
Compilation failed in require at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.
BEGIN failed--compilation aborted at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.

C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Can't locate UNIVERSAL/require.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at C:/Perl/lib/Web/Scraper.pm
line 12.
BEGIN failed--compilation aborted at C:/Perl/lib/Web/Scraper.pm line 12.
Compilation failed in require at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.
BEGIN failed--compilation aborted at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 6.

C:\MyPractice\Perl>

论坛徽章:
0
9 [报告]
发表于 2011-07-25 22:10 |显示全部楼层
本帖最后由 yhyhh 于 2011-07-26 12:25 编辑

呵呵,守得云开见月明了。不过好像中文解码错了,好吧,待小女子把如下解码方式变一变再来检验一番程序运行结果。

encode("gb2312",$value) --》 encode("utf-8",$value)


Anyway,终于有输出结果了啊,看到浙江两个字,兴奋之情不禁溢于言表。

C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Use of uninitialized value in concatenation (.) or string at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 31, <FILE> line
1.
Use of uninitialized value in concatenation (.) or string at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 32, <FILE> line
1.
        1396703         浙江犪橹?

C:\MyPractice\Perl>

论坛徽章:
0
10 [报告]
发表于 2011-07-25 22:12 |显示全部楼层
O my god, 改了编码方式之后,更加认不得了。

C:\MyPractice\Perl>Test_ipcheck_v5.pl mobilelist_v1.txt
Parsing of undecoded UTF-8 will give garbage when decoding entities at C:/Perl/lib/Web/Scraper.pm line 116, <FILE> line
1.
Use of uninitialized value in concatenation (.) or string at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 31, <FILE> line
1.
Use of uninitialized value in concatenation (.) or string at C:\MyPractice\Perl\Test_ipcheck_v5.pl line 32, <FILE> line
1.
        1396703         娴欐睙犺、宸?

C:\MyPractice\Perl>
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP