2

こんばんは、親愛なるコミュニティ!

Webスパイダー/クローラーのように、複数のWebページを処理したい。私はいくつかのビットを持っています-しかし今、私はいくつかの改良されたスパイダーロジックを持っている必要があります。target-urlhttp: //192.68.214.70/km/asps/schulsuche.asp?q =e&a=50を参照してください

アップデート:

2つの素晴らしいコメントのおかげで私はたくさん得ました。これで、コードは非常にうまく実行されます。最後の質問:データをファイルに保存する方法...パーサーに結果をファイルに書き込むように強制する方法。これは、コマンドラインで6000を超えるレコードを取得するよりもはるかに便利です...そして、出力がファイルで行われる場合は、最終的なクリーンアップを行う必要があります。出力を参照してください。すべての出力をターゲットURLと比較する場合-次に、これにはクリーンアップが必要であることを確認してください。どう思いますか?!もう一度target-urlhttp: //192.68.214.70/km/asps/schulsuche.asp?q =e&a=50を参照してください

6114,7754,"Volksschule Zeil a.Mai",/Sa,"d a.Mai",(Gru,"09524/94992 09524/94997",,Volksschulen,
6115,7757,"Mittelschule Zeil - Sa","d a.Mai",Schulri,"g 
97475       Zeil","09524/94995
09524/94997",,Volksschulen,"      www.hauptschule-zeil-sand.de"
6116,3890,"Volksschule Zeilar",(Gru,"dschule)
Bgm.-Stallbauer-Str. 8
84367       Zeilar",,"08572/439
08572/920001",,Volksschulen,"      www.gs-zeilarn.de"
6117,4664,"Volksschule Zeitlar",(Gru,"dschule)
Schulstra�e 5
93197       Zeitlar",,"0941/63528
0941/68945",,Volksschulen,"      www.vs-zeitlarn.de"
6118,4818,"Mittelschule Zeitlar","Schulstra�e 5
93197       Zeitlar",,,"0941/63528
0941/68945",,Volksschulen,"      www.vs-zeitlarn.de"
6119,7684,"Volksschule Zeitlofs (Gru","dschule)
Raiffeise","Str. 36
97799       Zeitlofs",,"09746/347
09746/347",,Volksschulen,"      grundschule-zeitlofs.de"

ありとあらゆる情報のためのthx!零!

ここに古い質問があります:ワンショット関数の一部としてうまく機能しているようです。しかし、ループの一部として関数を含めるとすぐに、何も返されません...どうしたのですか?

最初から始めましょう:ターゲットを参照してくださいhttp://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50 このページには6000以上の結果があります!どうすればすべての結果を得ることができますか?私はモジュールLWP::simpleを使用しており、すべての6150レコードを取得するために使用できるいくつかの改善された引数が必要です...私は非常に協力的なメンバーtadmicから盗むコードを持っています(このフォーラムを参照)-そしてそれは基本的に非常にうまく動作します。しかし、いくつかの行を追加した後-(現時点では)いくつかのエラーを吐き出します。

試行:最初の5ページのURLは次のとおりです。

http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=0 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=50 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=100 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=150 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=200

URLの「s」属性はページ1では0から始まり、その後はページごとに50ずつ増加することがわかります。この情報を使用して、ループを作成できます。

#!/usr/bin/perl  
use warnings;  
use strict;  
use LWP::Simple;  
use HTML::TableExtract;  
use Text::CSV;  

my @cols = qw(  
    rownum  
    number  
    name  
    phone  
    type  
    website  
);  

my @fields = qw(  
    rownum  
    number  
    name  
    street  
    postal  
    town  
    phone  
    fax  
    type  
    website  
);  

my $i_first = "0";   
my $i_last = "6100";   
my $i_interval = "50";   

for (my $i = $i_first; $i <= $i_last; $i += $i_interval) {   
    my $html = get("http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=$i");   
    $html =~ tr/r//d;     # strip the carriage returns  
    $html =~ s/&nbsp;/ /g; # expand the spaces  

    my $te = new HTML::TableExtract();  
    $te->parse($html);  

    my $csv = Text::CSV->new({ binary => 1 });  

    foreach my $ts ($te->table_states) {  
        foreach my $row ($ts->rows) {  
            #trim leading/trailing whitespace from base fields  
            s/^s+//, s/\s+$// for @$row;  

            #load the fields into the hash using a "hash slice"  
            my %h;  
            @h{@cols} = @$row;  

            #derive some fields from base fields, again using a hash slice  
            @h{qw/name street postal town/} = split /n+/, $h{name};  
            @h{qw/phone fax/} = split /n+/, $h{phone};  

            #trim leading/trailing whitespace from derived fields  
            s/^s+//, s/\s+$// for @h{qw/name street postal town/};  

            $csv->combine(@h{@fields});  
            print $csv->string, "\n";  
        }  
    } 
}

コードをテストしたところ、次の結果が得られました。

ところで:ここでは57行目と58行目: ...コマンドラインはihaveエラーがここにあることを示しています..:

    #trim leading/trailing whitespace from derived fields  
        s/^s+//, s/\s+$// for @h{qw/name street postal town/};  

どう思いますか?バックスラッシュが欠落していますか?結果が正しくなるようにコードを修正してテスト実行する方法!?

ゼロからのご連絡をお待ちしております

私が得るエラーを見てください:

    Ot",,,Telefo,Fax,Schulat,Webseite                                                          Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        "lfd. N.",Schul-numme,Schul,"ame                                                                           
    Sta�e
    PLZ 
    Ot",,,Telefo,Fax,Schulat,Webseite
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
"lfd. N.",Schul-numme,Schul,"ame
    Sta�e
    PLZ 
    Ot",,,Telefo,Fax,Schulat,Webseite
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
"lfd. N.",Schul-numme,Schul,"ame
4

3 に答える 3

3

いつでも$_undefそれに関連する置換が発生すると、これらの警告が発生します。s///構築は暗黙的にで機能し$_ます。defined解決策は、置換を試みる前に確認することです。

それとは別に、警告とは関係ありませんが、正規表現に論理エラーがあります。

s/^s+//, s/\s+$// for @h{qw/name street postal town/};

\最初の構成に欠落していることに注意してください。

エラーを削除して単純化する:

defined and s{^ \s+ | \s+ $}{}gx for @h{qw/name street postal town/};

ファイルに出力するには、forループの前に以下を追加します。

open my $fh, '>', '/path/to/output/file' or die $!;

交換:

print $csv->string, "\n";

と:

print $fh $csv->string, "\n";

print LISTこれは、からへの構文上の変更print FILEHANDLE LISTです。

参照:

于 2011-02-26T15:05:29.090 に答える
3

あなたが言うように、この行はキャリッジリターンを削除しません:

$html =~ tr/r//d;     # strip the carriage returns  

必要になるだろう:

$html =~ tr/\r//d;     # strip the carriage returns

そして多分:

$html =~ tr/\r\n//d;     # strip the carriage returns  
于 2011-02-26T15:10:10.567 に答える
1

ページからリンクを抽出しようとしている場合は、WWW :: Mechanizeを使用します。これは、LWPのラッパーであり、HTMLを適切に解析してリンクを取得するだけでなく、Webページをスクレイピングする人々にとって便利なものです。

于 2011-02-26T20:16:42.307 に答える