21

以前、Groovy でこれを行う方法を尋ねました。ただし、すべての CPAN ライブラリのために、Perl でアプリを書き直しています。

ページに次のリンクが含まれている場合:

<a href="http://www.google.com">Google</a>

<a href="http://www.apple.com">アップル</a>

出力は次のようになります。

Google、http://www.google.com
アップル、http://www.apple.com

Perlでこれを行う最良の方法は何ですか?

4

11 に答える 11

41

これについては、 WWW::Mechanizeモジュールの使用を参照してください。Web ページを取得し、URL のリストを簡単に操作できるようにします。

my $mech = WWW::Mechanize->new();
$mech->get( $some_url );
my @links = $mech->links();
for my $link ( @links ) {
    printf "%s, %s\n", $link->text, $link->url;
}

非常に簡単です。そのページの他の URL に移動する場合は、さらに簡単です。

Mech は基本的に、オブジェクト内のブラウザーです。

于 2008-10-31T19:40:37.067 に答える
11

HTML::LinkExtractorHTML:: LinkExtorを見てください。これは、 HTML::Parserパッケージの一部です。

HTML::LinkExtractorはHTML::LinkExtorに似ていますが、URLを取得するだけでなく、リンクテキストも取得する点が異なります。

于 2008-10-31T17:59:17.223 に答える
6

私はこのようなことにpQueryを使用するのが好きです...

use pQuery;

pQuery( 'http://www.perlbuzz.com' )->find( 'a' )->each(
    sub {
        say $_->innerHTML . q{, } . $_->getAttribute( 'href' );
    }
);

同様の回答については、この以前のstackoverflow.comの質問Emulation of lex like functions in Perl or Pythonもチェックしてください。

于 2008-10-31T18:49:26.780 に答える
6

冒険好きで、モジュールなしで試してみたい場合は、次のようなものが機能するはずです (ニーズに合わせて調整してください)。

#!/usr/bin/perl

if($#ARGV < 0) {
  print "$0: Need URL argument.\n";
  exit 1;
}

my @content = split(/\n/,`wget -qO- $ARGV[0]`);
my @links = grep(/<a.*href=.*>/,@content);

foreach my $c (@links){
  $c =~ /<a.*href="([\s\S]+?)".*>/;
  $link = $1;
  $c =~ /<a.*href.*>([\s\S]+?)<\/a>/;
  $title = $1;
  print "$title, $link\n";
}

ここでいくつか間違ったことをした可能性がありますが、作成後に試したいくつかのテスト ケースでは機能します (<img> タグなどは考慮されていません)。

于 2012-06-04T20:39:14.977 に答える
5

これを行う別の方法は、XPath を使用して解析済み HTML を照会することです。特定のクラスで div 内のすべてのリンクを抽出するなど、複雑な場合に必要です。これには HTML::TreeBuilder::XPath を使用します。

  my $tree=HTML::TreeBuilder::XPath->new_from_content($c);
  my $nodes=$tree->findnodes(q{//map[@name='map1']/area});
  while (my $node=$nodes->shift) {
    my $t=$node->attr('title');
  }
于 2008-11-05T17:49:25.790 に答える
4

または、HTML::LinkExtor を拡張して、必要なことを行い、変更を作成者に送信することを検討してください。

于 2008-11-02T02:43:11.503 に答える
4

ShermはHTML::LinkExtorを推奨しました。これはほとんどあなたが望むものです。残念ながら、<a> タグ内のテキストを返すことはできません。

AndyはWWW::Mechanizeを推奨しました。それがおそらく最善の解決策です。

WWW::Mechanize が気に入らない場合は、HTML::TreeBuilderを試してください。HTML から DOM のようなツリーを構築し、必要なリンクを検索して、必要な近くのコンテンツを抽出できます。

于 2008-10-31T19:47:11.687 に答える
4

以前の回答は完璧でした。パーティーに遅れたことはわかっていますが、これは [perl] フィードにぶつけられたので…</p>

XML::LibXMLは、HTML の解析に優れており、速度の点で優れています。recover不適切な形式の HTML を解析するときのオプションを設定します。

use XML::LibXML;

my $doc = XML::LibXML->load_html(IO => \*DATA);
for my $anchor ( $doc->findnodes("//a[\@href]") )
{
    printf "%15s -> %s\n",
        $anchor->textContent,
        $anchor->getAttribute("href");
}

__DATA__
<html><head><title/></head><body>
<a href="http://www.google.com">Google</a>
<a href="http://www.apple.com">Apple</a>
</body></html>

–利回り–</p>

     Google -> http://www.google.com
      Apple -> http://www.apple.com
于 2011-03-22T23:10:38.720 に答える
3

HTML::LinkExtractorは HTML::LinkExtor より優れています

リンク テキストと URL の両方を指定できます。

使用法:

 use HTML::LinkExtractor;
 my $input = q{If <a href="http://apple.com/"> Apple </a>}; #HTML string
 my $LX = new HTML::LinkExtractor(undef,undef,1);
 $LX->parse(\$input);
 for my $Link( @{ $LX->links } ) {
        if( $$Link{_TEXT}=~ m/Apple/ ) {
            print "\n LinkText $$Link{_TEXT} URL $$Link{href}\n";
        }
    }
于 2013-09-13T12:19:04.157 に答える
2

HTML は構造化されたマークアップ言語であり、エラーなしでその意味を抽出するために解析する必要があります。リストされているモジュール Sherm は HTML を解析し、リンクを抽出します。入力が常に同じ方法で形成されることがわかっている場合 (属性を忘れないでください)、その場しのぎの正規表現ベースのソリューションは受け入れられるかもしれませんが、パーサーはほとんどの場合、構造化テキストを処理するための正しい答えです。

于 2008-10-31T18:49:00.430 に答える
-1

正規表現を使用して、リンク テキストを含むリンクを抽出できます。これも一つの方法です。

local $/ = '';
my $a = <DATA>;

while( $a =~ m/<a[^>]*?href=\"([^>]*?)\"[^>]*?>\s*([\w\W]*?)\s*<\/a>/igs )
{   
    print "Link:$1 \t Text: $2\n";
}


__DATA__

<a href="http://www.google.com">Google</a>

<a href="http://www.apple.com">Apple</a>
于 2013-01-29T09:36:48.043 に答える