免费注册 查看新帖 |

Chinaunix

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

奔溃中,请教一个关于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 19:36 |只看该作者
没看你的模式匹配,但你最后print $line; 岂不是只把iplist.txt里的的值输出来了!

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



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

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

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

print "$line $1 \n";

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
4 [报告]
发表于 2011-07-24 23:21 |只看该作者
本帖最后由 iakuf 于 2011-07-24 23:22 编辑
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use URI;
  4. use LWP;
  5. use Encode;
  6. use Web::Scraper;

  7. #用法 ip138search.pl iplist.txt
  8. #以iplist.txt为参数,传入给变量$filename
  9. my $filename=$ARGV[0];
  10. open(FILE,$filename) || die "faile";
  11. my $line = '0';
  12. while($line=<FILE>){
  13.     chomp($line);

  14.     my $url = "http://www.ip138.com:8080/search.asp?action=mobile&mobile=$line";
  15.     my $ua  = LWP::UserAgent->new;
  16.     my $res = $ua->get( $url);  

  17.     if($res->is_success) {
  18.         my $value = $res->decoded_content;
  19.         my $out = encode("utf-8",$value);

  20.         my $scraper = scraper {
  21.             process '/html/body/table[2]/*/td','comment[]' => 'TEXT';
  22.         };  
  23.         my $result = $scraper->scrape( $out );
  24.         print "$result->{comment}[1]\t$result->{comment}[2]\t";
  25.         print "$result->{comment}[3]\t$result->{comment}[4]\n";
  26.     }   
  27.     else {
  28.         die $res->status_line;
  29.     }   
  30. }
  31. close(FILE);
复制代码
这个可以达到你的要求,使用 Web::Scraper 来解码网页吧,会容易多了,妹子,想了解这个可以看 http://www.php-oa.com/2010/11/30/perl-web-scraper.html 这个中使用 Web::Scraper 的例子

论坛徽章:
0
5 [报告]
发表于 2011-07-25 03:06 |只看该作者
本帖最后由 Kitaisky 于 2011-07-25 03:28 编辑

听楼上的劝;如果非得执迷不悟的话,看下面这个:


#!/usr/bin/perl -w

use strict;
use warnings;

{
local $/;

  while (my $lines = <DATA>) {

    $lines =~ /<TD.+?(您查询的手机号码段).+?(?:<td.+?<\/td>.+?){3}<td.+?>(.+?)<\/td>\r?\n/is;

    print "$1:\t", "$2\n";

  }
}

## $lines =~ /<TD.+?(您查询的手机号码段)     # Start the fun, with $1=您查询的手机号码段

## .+?(?:<td.+?<\/td>.+?){3}         ## Bump along 3 pairs of <td>...</td>

##<td.+?>(.+?)<\/td>\r?\n/isx      ## in the 4th pair is my $2= 江苏&nbsp;无锡


__DATA__
<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
6 [报告]
发表于 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
7 [报告]
发表于 2011-07-25 20:59 |只看该作者
小女子试了大侠介绍的方法,用web::Scraper, 执行结果如下:

C:\MyPractice\Perl>Test_ipcheck_v5. ...
yhyhh 发表于 2011-07-25 20:56


妹子,到cpan上把这个模块找到,装上!或者用cpanm装

论坛徽章:
0
8 [报告]
发表于 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
9 [报告]
发表于 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
10 [报告]
发表于 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>

接着找库文件去~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP