-7

正規表現を使用して複数行の html ファイルを解析しようとしています。

HTML コード:

<td>Details</td></tr>  
<tr class=d1>
<td>uss_vod_translator</td>

正規表現:

if ($line =~ m/Details<\/td>\s*<\/tr>\s*<tr\s*class=d1>\s*<td>(\w*)<\/td>/)
{
    print "$1";
}

/s*複数行に (スペース) を使用していますが、機能していません。複数行にも使用さ/\?れていましたが、それも機能しませんでした。

複数行の HTML を解析する方法を教えてください。

正規表現が HTML を解析するための不十分なソリューションであることは知っています。しかし、私は解析する必要があり、他に選択肢がないレガシー HTML コードを持っています。

4

3 に答える 3

12

複数行のHTMLを解析する方法を教えてもらえますか?

正規表現の使用をやめ、それを解析するモジュールを使用してください。

HTML::TreeBuilderは優れたソリューションです。

HTML :: TreeBuilder :: LibXMLは同じAPIを提供しますが、高速パーサーに支えられています。

HTML :: TreeBuilder :: XPathは、XPathサポートと高速パーサーを追加します。

于 2012-11-06T10:53:39.513 に答える
0

前述のように、HTML の解析に正規表現を使用しないでください

HTML::TreeBuilder::XPath を使用して HTML を解析しています。これにより、各スクレイピング/解析プログラムの作成時間が大幅に短縮されます。

タスクを実装する方法は次のとおりです。

use Modern::Perl;
use HTML::TreeBuilder::XPath;

my $html = <<END;
<tr><td>General Info</td></tr>  
<tr class=d1>
<td>some info</td></tr>
<tr><td>Details</td></tr>  
<tr class=d1>
<td>uss_vod_translator</td></tr>
<tr><td>Another header</td></tr>  
<tr class=d1>
<td>some other info</td></tr>
END

my $tree = HTML::TreeBuilder::XPath->new_from_content($html);

my ($details) = $tree->findvalues('//tr[ td[ text() = "Details" ] ]/following-sibling::tr[1]/td[1]');
say $details;
于 2012-12-06T10:48:00.903 に答える
-3

パターンを一致させる前に、以下の行を試してください

 $line=~s/>(\n|\t|\s)+</></gs;

次に、HTML文字列を1行で作成できます。

于 2012-11-06T11:25:40.020 に答える