我在做什么?该脚本从.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::UserAgent
和CGI
。。。