Perl を使用して正規表現によるリンクの HTML ページを解析する [重複]
-
18-09-2019 - |
質問
さて、私は今、言語の選択を Perl に切り替えたばかりのクライアントの仕事に取り組んでいます。私は Perl が得意ではありませんが、少し前ではありますが、Perl を使ってこのようなことをやったことがあります。
次のようなリンクがたくさんあります。
<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');" class="bnone">Death Becomes Her
(1992)</a>
パス "/en/subtitles/3586224/death-becomes-her-en" と一致させて、それらを配列またはリストに入れたいと考えています (Perl ではどれが適切かはわかりません)。私は Perl のドキュメントを検索したり、正規表現のチュートリアルを見たりしてきましたが、すべてではないにしても、ほとんどが、一致をキャプチャするのではなく、何かを一致させるために ~= を使用することを目的としているように見えました。
ありがとう、
コーディ
解決
適切な HTML パーサーを使用して HTML を解析します。見る この例 に含まれる HTML::パーサー.
あるいは、次の簡単な例を考えてみましょう。
#!/usr/bin/perl
use strict; use warnings;
use HTML::TokeParser::Simple;
my $parser = HTML::TokeParser::Simple->new(\*DATA);
my @hrefs;
while ( my $anchor = $parser->get_tag('a') ) {
if ( my $href = $anchor->get_attr('href') ) {
push @hrefs, $href if $href =~ m!/en/subtitles/!;
}
}
print "$_\n" for @hrefs;
__DATA__
<a href="/en/subtitles/3586224/death-becomes-her-en" title="subtitlesDeath
Becomes Her" onclick="reLink('/en/subtitles/3586224/death-becomes-her-en');"
class="bnone">Death Becomes Her
(1992)</a>
出力:
/en/subtitles/3586224/death-becomes-her-en
他のヒント
正規表現は使用しないでください。次のような HTML パーサーを使用します HTML::ツリービルダー.
my @links;
my $tree = HTML::TreeBuilder->new; # empty tree
$tree->parse_file($file_name);
$tree->elementify;
my @links = map { $_->attr('href') } $tree->look_down( _tag => 'a');
$tree = $tree->delete;
# Do stuff with links array
例のような URL は、次のような正規表現と一致させることができます。
($url) = /href=\"([^\"]+)\"/i
HTML で URL の前後に一重引用符が使用されている (または引用符が使用されていない) 場合、または URL に引用符文字が含まれている場合、これは完全に正しく機能しません。このため、HTML の解析に正規表現を使用しないようにという回答も得られます。それらに注意してください。ただし、入力が適切に行われると確信できる場合は続行してください。
所属していません StackOverflow