1

私は何をやっている?スクリプトは、.txt(locations.txt)から文字列をロードし、それを6つの変数に分割します。各変数はコンマで区切られます。次に、アドレスがこれらの6つの値に依存するWebサイトにアクセスします。

何が問題ですか?location.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
4

2 に答える 2

2

私は Mechanize を使用したことがないので、URL をエンコードする必要があるかどうかはわかりません。%20実行する+前にスペースをエンコードしてみてください$mech->get

$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);  

それを試してみてください。

于 2013-02-13T03:01:17.083 に答える