Perl-当变量有空格(两个单词)时,在URL中使用输入文件中的变量



我在做什么?该脚本从.txt(locations.txt)中加载一个字符串,并将其分隔为6个变量。每个变量用逗号分隔。然后我去了一个网站,它的地址取决于这6个值。

问题出在哪里?如果在locations.txt中的变量中有一个空格作为字符串的一部分。当有空格时,它不会得到正确的url。

输入文件为:

 locations.txt = Heinz,Weber,Sierra Leone,1915,M,White

因为塞拉利昂有一个空间,url是:

  https://familysearch.org/search/collection/results#count=20&query=%2Bgivenname%3AHeinz%20%2Bsurname%3AWeber%20%2Bbirth_place%3A%22Sierra%20Leone%22%20%2Bbirth_year%3A1914-1918~%20%2Bgender%3AM%20%2Brace%3AWhite&collection_id=2000219

但在下面的代码中,这并没有得到正确的处理。

我正在使用以下软件包:

 use strict;
 use warnings;
 use WWW::Mechanize::Firefox;
 use HTML::TableExtract;
 use Data::Dumper;
 use LWP::UserAgent;
 use JSON;
 use CGI qw/escape/;
 use HTML::DOM;

这是代码的开始:

 open(my $l, 'locations26.txt') or die "Can't open locations: $!";
 open(my $o, '>', 'out2.txt') or die "Can't open output file: $!";
 while (my $line = <$l>) {
      chomp $line;
       my %args;
      @args{qw/givenname surname birth_place birth_year gender race/} = split /,/, $line;
     $args{birth_year} = ($args{birth_year} - 2) . '-' . ($args{birth_year} + 2); 
      my $mech = WWW::Mechanize::Firefox->new(create => 1, activate => 1); 
      $mech->get("https://familysearch.org/search/collection/results#count=20&query=%2Bgivenname%3A".$args{givenname}."%20%2Bsurname%3A".$args{surname}."%20%2Bbirth_place%3A".$args{birth_place}."%20%2Bbirth_year%3A".$args{birth_year}."~%20%2Bgender%3AM%20%2Brace%3AWhite&collection_id=2000219");  
# REST OF THE SCRIPT HERE. MANY LINES.

}

作为另一个例子,以下方法将起作用:

locations.txt = Benjamin,Schuvlein,Germany,1913,M,White

我没有使用机械化,所以不确定是否需要对URL进行编码。在运行$mech->get 之前,尝试将空间编码为%20+

$url =~ s/ /+/g;

$url =~ s/ /%20/g

以有效的为准:)

====编辑:

my $url = "https://familysearch.org/search/collection/results#count=20& query=%2Bgivenname%3A".$args{givenname}."%20%2Bsurname%3A".$args{surname}."%20%2Bbirth_place%3A".$args{birth_place}."%20%2Bbirth_year%3A".$args{birth_year}."~%20%2Bgender%3AM%20%2Brace%3AWhite&collection_id=2000219";
$url =~ s/ /+/g;
$mech->get($url);  

试试看。

如果您有错误

Global symbol "$url" requires explicit package name.

这意味着您忘记用声明$url

my $url;

你的使用部分看起来很奇怪,我很确定你不需要同时使用所有这些模块。如果你使用WWW::Mechanize,我想不需要LWP::UserAgentCGI。。。

相关内容

  • 没有找到相关文章