1

私は、perl でスクリーン スクレイプを実行しようとしており、それをテーブル要素の配列に落とし込もうとしています。

文字列:

<tr>
        <td>10:11:00</td>
        <td><a href="/page/controller/33">712</a></td>
        <td>Start</td>
        <td>Finish</td>
        <td>200</td>
        <td>44</td>

コード:

if($item =~ /<td>(.*)?<\/td>/)
            {
                print "\t$item\n";
                print "\t1: $1\n";
                print "\t2: $2\n";
                print "\t3: $3\n";
                print "\t4: $4\n";
                print "\t5: $5\n";
                print "\t6: $6\n";
            }

出力:

1: 10:11:00
2: 
3: 
4: 
5: 
6: 

複数のことを試しましたが、意図した結果を得ることができませんでした。考え?

4

2 に答える 2

5
use strict;
use warnings;

my $item = <<EOF;
<tr>
        <td>10:11:00</td>
        <td><a href="/page/controller/33">712</a></td>
        <td>Start</td>
        <td>Finish</td>
        <td>200</td>
        <td>44</td>
EOF

if(my @v = ($item =~ /<td>(.*)<\/td>/g))
{
  print "\t$item\n";
  print "\t1: $v[0]\n";
  print "\t2: $v[1]\n";
  print "\t3: $v[2]\n";
  print "\t4: $v[3]\n";
  print "\t5: $v[4]\n";
  print "\t6: $v[5]\n";
}

また

if(my @v = ($item =~ /<td>(.*)<\/td>/g))
{
  print "\t$item\n";
  print "\t$_: $v[$_-1]\n" for 1..@v;
}

出力:

1: 10:11:00
2: <a href="/page/controller/33">712</a>
3: Start
4: Finish
5: 200
6: 44
于 2012-12-11T02:49:13.477 に答える
1

コードは、指定したとおりに動作します。これが起こることです:

正規表現を 1 回だけ一致させました。一致し、$1変数に最初の (そして唯一の) キャプチャ バッファの値が設定されました。一致すると「true」が返され、if ブランチのコードが実行されます。

次の 2 つのことを行います。

  1. /gモディファイヤと一致します。これはグローバルに一致し、最初の一致だけでなく、文字列内のすべての一致を返そうとします。
  2. キャプチャ バッファを配列に保存できるように、リスト コンテキストで正規表現を実行します。

これにより、次のコードが生成されます。

if ( my @matches = ($item =~ /REGEX/g) ) {
  for my $i (1 .. @matches) {
    print "$i: $matches[$i-1]\n";
  }
}

また、正規表現を使用してHTML を解析することは悪であることに注意してください。CPANを検索して、好きなモジュールを検索する必要があります。

于 2012-12-11T02:49:49.377 に答える