質問

重複の可能性:
Perl を使用して HTML から外部リンクを削除するにはどうすればよいですか?

さて、私は今、言語の選択を 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 の解析に正規表現を使用しないようにという回答も得られます。それらに注意してください。ただし、入力が適切に行われると確信できる場合は続行してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top