免费注册 查看新帖 |

Chinaunix

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

新手求助,代码问题出在哪里? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-17 12:10 |只看该作者 |倒序浏览
为了下载http://www.additive-net.de/software/origin/origin.tutorials.shtml这里的SWF文件,写了个脚本,但是下载不了,我是新手,请各位给予指点迷津,非常感谢!

use LWP::UserAgent;
$ua = LWP::UserAgent->new;

$url="http://www.additive-net.de/software/origin/origin.tutorials.shtml";
$res = $ua->get($url);
$html = $res->content;
$html=~m%<param name=movie value=\"(.*?)\.swf\">%g;
#<param name=movie value="http://www.originlab.com/ftp/mm_tutorials/import_wizard75.swf">

while ($1){

$up="$1.swf\n";
$dir="C:\\$1.swf";
$res1 = $ua->get($up, ':content_file' => $dir);

}

论坛徽章:
0
2 [报告]
发表于 2008-08-17 14:19 |只看该作者

  1. while ( $1)
  2. ...
复制代码

这个是死循环吧

论坛徽章:
0
3 [报告]
发表于 2008-08-17 14:29 |只看该作者
而且你抓取的网页不正确
你那表达式根本匹配不到任何东西
你首先要分析你抓取文件里面的shtml文件
然后再抓取此文件,swf的具体路径是包含在这些子shtml文件里面的

论坛徽章:
0
4 [报告]
发表于 2008-08-17 14:57 |只看该作者

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use LWP::UserAgent;
  5. my $ua = LWP::UserAgent->new;
  6. my $url="http://www.additive-net.de/software/origin/origin.tutorials.shtml";
  7. my $res = $ua->get($url);
  8. my $html = $res->content;
  9. my $dir = "c:\\swf";
  10. my @html = $html =~ /<td class="tabgrau"><a href="([^"]+)"/g;
  11. foreach ( @html ) {
  12.                                 $res = $ua->get("http://www.additive-net.de/software/origin/".$_);
  13.                                 my $message = $res->content;
  14.                                 my $swf = $1 if $message =~ /<embed src="([^"]+)"/;
  15.                                 my $name = $1 if $swf =~ m#/([^/]+)$#;
  16.                                 print "Downloading $swf\n" ;
  17.                                 $res = $ua->get($swf,":content_file" => $dir."\\".$name);
  18.                                 print "Successfully downloaded $name\n" if $res->is_success;
  19. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2008-08-17 17:04 |只看该作者
多谢churchmice 大侠的热情帮助。。

my $name = $1 if $swf =~ m#/([^/]+)$#;

这个正则如何理解?

论坛徽章:
0
6 [报告]
发表于 2008-08-17 17:48 |只看该作者

回复 #5 hhhnano 的帖子


  1. my $name = $1 if $swf =~ m#/([^/]+)$#
复制代码

这个匹配定界符是##,所以里面的/没有特殊意义,
$代表末尾,[^/]表示匹配的内容为除/以外的任何字符
类似于basename的功能,就是把
a/b/c/d
中的d给提取出来

论坛徽章:
0
7 [报告]
发表于 2008-08-17 20:27 |只看该作者
非常感谢churchmice 大牛醍醐灌顶的指点迷津!
my $name = $1 if $swf =~ m#/([^/]+)$#
这个基本理解了,还有个小问题,我去掉前面的“/”,代码运行也正常,这个符号加在这里有什么好处么?或者是程序更易懂?

论坛徽章:
0
8 [报告]
发表于 2008-08-17 21:04 |只看该作者

回复 #7 hhhnano 的帖子

其实运行起来没有区别
但是还是建议加上
否则如果正则引擎内部没有给你优化的话会在每一个不是/的地方开始匹配
而如果有/限制的话只会在/的地方开始匹配
你可以看下面的代码

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my $string = "ab/cd/ef";
  5. print "With / \n";
  6. $string =~ m#(?{print "Staring match at $`|$'\n"})/([^/]+)$#;
  7. print "Without /\n";
  8. $string =~ m#(?{print "Staring match at $`|$'\n"})([^/]+)$#;
复制代码

运行结果
With /
Staring match at ab|/cd/ef
Staring match at ab/cd|/ef
Without /
Staring match at |ab/cd/ef
Staring match at a|b/cd/ef
Staring match at ab/|cd/ef
Staring match at ab/c|d/ef
Staring match at ab/cd/|ef

可以看到两者的区别,如果使用了/,则匹配次数从6减为2,从而提高了效率
当然,功能是第一位的,如果能够优化一下就更好了

论坛徽章:
0
9 [报告]
发表于 2008-08-17 21:31 |只看该作者
多谢了,讲解的清楚透彻,受益匪浅!

论坛徽章:
0
10 [报告]
发表于 2008-08-20 09:45 |只看该作者
高手真多。..受益匪浅!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP