1

トリプルジョブ: ツリー タスクを実行する必要があります。3 つのタスクがあります。

  1. ページを取得する
  2. HTML を解析する
  3. データを保存... そして、はい - これは真の Perl ジョブです!

スイスのサイトの 6000 のサブページすべてでパーサー ジョブを実行する必要があります。(政府のサイト - 非常に優れたサーバーを備えています)。

http://www.educa.ch/dyn/79362.asp?action=searchを参照 してください (約 6000 件の結果
が表示さ れない場合は、.

詳細ページはこんな感じです。

[リンクテキスト][1]

  • エコール ヌーベル ドゥ ラ スイス ロマンド Ch. de Rovéréaz 20 Case postal 161 1000 ローザンヌ 12 ウェブサイト info@ensr.ch Tel:021 654 65 00 Fax:021 654 65 05

別の詳細ページはこれを示しています:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta name="generator" content="DigiOnline GmbH - WebWeaver 3.4 CMS - "><title>educa.ch</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><link rel="stylesheet" href="101.htm"><script src="102.htm"></script><script language="JavaScript"><!--
var did='d79376';
var root=new Array('d200','d205','d73137','d1566','d79376','d');
var usefocus = 1;
function check() {
if ((self.focus) && (usefocus)) {
self.focus();
}
}
// --></script></head><body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" onload="check();"><table cellspacing="0" cellpadding="0" border="0" width="100%"><tr><td width="15" class="popuphead"><img src="/0.gif" alt="" width="15" height="16"></td><td width="99%" class="popuphead">Adresse - Schulen in der Schweiz</td><td width="20" class="popuphead" valign="middle"><a href="#" title="Print" onclick="window.print(); return false;"><img src="../pics/print16x13.gif" alt="Drucken" width="16" height="13"></a></td><td width="20" class="popuphead" valign="middle"><a href="#" title="close" onclick="window.close(); return false;"><img src="../pics/close21x13.gif" alt="Schliessen" width="21" height="13"></a></td></tr><tr bgcolor="#B2B2B2"><td colspan="4"><img src="/0.gif" alt="" width="1" height="1"></td></tr></table><div class="leerzeile">&#160;</div><div class="leerzeile"><img src="/0.gif" alt="" width="15" height="8">Auseklis - Schule für lettische Sprache und Kultur</div><div class="leerzeile">&#160;</div><div><img src="/0.gif" alt="" width="15" height="8">Mutschellenstrasse 37</div><div><img src="/0.gif" alt="" width="15" height="8"></div><div><img src="/0.gif" alt="" width="15" height="8">8002&#160;Zürich</div><div class="leerzeile">&#160;</div><div><img src="/0.gif" alt="" width="15" height="8"><a href="http://latvia.yourworld.ch" target="_blank">latvia.yourworld.ch</a></div><div><img src="/0.gif" alt="" width="15" height="8"><a href="mailto: schorderet@inbox.lv">schorderet@inbox.lv</a></div><div class="leerzeile">&#160;</div><div><img src="/0.gif" alt="" width="15" height="8">Tel:<img src="/0.gif" alt="" width="6" height="8">+41786488637</div><div><img src="/0.gif" alt="" width="15" height="8">Fax:<img src="/0.gif" alt="" width="4" height="8"></div><div>&#160;</div></body></html>

** HTML::TokeParser または HTML::TokeParser** または * HTML::TreeBuilder::LibXML *でこの仕事をしたいのですが、HTML::TreeBuilder::LibXML の経験はほとんどありません

この仕事にはどちらを選びますか: 注 - 結果を MySQL-DB に保存したいと考えています。最善の方法は、解析後にすぐに保存することです。

したがって、次の 3 つのタスクがあります。

  1. ページを取得する
  2. HTML を解析する
  3. データの保存

最初の項目: LWP::UserAgent を使用して取得します。このフォーラムには、そのモジュールを使用してデータを投稿し、結果のページを取得する多くの例があります。ところで、必要に応じて代わりに Mechanize を使用できます。

2 番目:たとえば、HTML::TokeParser またはその他のモジュールを使用してページを解析し、必要なデータのみを取得します。

3 番目:データをすぐにデータベースに格納します。途中で一時ファイルを作成する必要はありません。

うーん - 最初と 2 番目の質問 - 取得方法と解析方法。

4

1 に答える 1

2

あなたの質問は非常に一般的であるため、具体的すぎるのは難しいです。LWP を使用してページを取得し、TokeParser を使用してデータを抽出し、出力をデータベースに何度も格納しました。私は Mech を使ったことはありませんが、どう考えても LWP より簡単です。

LWP を使用してユーザー エージェントを作成するのは、次のように簡単です。

my $ua = LWP::UserAgent->new();

要件に応じて、リダイレクト、プロキシ、Cookie、パスワードなどを考慮する必要があります。

リダイレクトをフォローするには:

$ua = LWP::UserAgent->new(
    requests_redirectable =>   ['GET', 'HEAD', 'POST' ]
);

クッキーを保存するには:

$ua->cookie_jar( {} );

プロキシを設定するには:

$ua->proxy("http", "http://localhost:8888");  # Fiddler

認証用のパスワードを追加するには:

$ua->credentials( 'www.myhostingplace.com:443' , 'Realm' , 'userid', 'password');

ローカル処理のためにページからコンテンツを取得するには:

$url = 'http://www.someurl.com'
my $response  = $ua->get($url);
if ( $response->is_error() ) {
   # Do some error stuff
}
my $content = $response->content();

TokeParser を使用してコンテンツを解析するには:

my $stream = new HTML::TokeParser(\$content);

while ( my $t = $stream->get_token() ) {
   if ( $t->[0] eq 'S' and $t->[1] eq 'input' ) {
      if ( uc( $t->[2]{ 'name' } ) eq 'SEARCHVALUE' ) {
           my $data = $t->[2]{ 'value' };
           # Do something with data
      }
   }
}

データは参照として TokeParser に渡されます。次に、get token を使用してストリームをウォークスルーします。各 HTML 要素は、次に何をすべきかを判断するために調べることができる配列に渡されます。

上記の例では、「SEARCHVALUE」という属性名を持つ入力タグを検索し、「値」属性を保存します。HTML フラグメントは次のようになります。

<input type="hidden" name="SEARCHVALUE" value="Spock" />

入力タグ ($t->[0] eq 'S' および $t->[1] eq 'input') の先頭に到達すると、タグの「name」属性を調べます (t->[2 ]{ 'name' }) 探している値と一致するかどうかを確認します。その場合、タグの値属性 ($t->[2]{ 'value' }) を変数に格納します。その後、データベースに保存するなど、値を使って好きなことを行うことができます。

TokeParser を使用すると多くのことができます。場合によっては、正規表現を使用してページを分割するよりも簡単な場合もありますが、理解するのが少し難しい場合もあります。返された HTML コンテンツから単純なパターンを抽出しようとしている場合は、正規表現が適しています。

やるべきことがたくさんあるなら、O'Reilly の Sean Burke による "Perl and LWP" をお勧めします。私のWebスクレイピングの取り組みにおいて、それは私にとって際限なく役に立ちました.

これが少なくとも始めるのに役立つことを願っています。

于 2010-10-22T00:03:41.487 に答える