5

リンクでいっぱいの .html ファイルがあります。http:// を付けずにドメインを抽出し (リンクのホスト名部分のみ、たとえば blah.com)、それらをリストして重複を削除したいと考えています。

これは私がこれまでに思いついたことです-問題は $tree データを渡そうとしている方法だと思います

#!/usr/local/bin/perl -w

use HTML::TreeBuilder 5 -weak; # Ensure weak references in use
use URI;
  foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new; # empty tree
    $tree->parse_file($file_name);
    my $u1 = URI->new($tree);
    print "host: ", $u1->host, "\n";
    print "Hey, here's a dump of the parse tree of $file_name:\n";

    # Now that we're done with it, we must destroy it.
    # $tree = $tree->delete; # Not required with weak references
  }
4

2 に答える 2

4

個人的には、これには Mojo::DOM を使用し、URI モジュールを使用してドメインを抽出します。

  use Mojo::DOM;
  use URI;
  use List::AllUtils qw/uniq/;

  my @domains = sort +uniq
    map eval { URI->new( $_->{href} )->authority } // (),
        Mojo::DOM->new( $html_code )->find("a[href]")->each;

(PS の例外処理->authorityは、いくつかの URI がここで鳴り響くためです。mailto:s のように)

于 2014-03-16T15:05:24.617 に答える
2

別のオプションは次のとおりです。

use strict;
use warnings;
use Regexp::Common qw/URI/;
use URI;

my %hosts;

while (<>) {
    $hosts{ URI->new($1)->host }++ while /$RE{URI}{-keep}/g;
}

print "$_\n" for keys %hosts;

コマンドラインの使用法:perl script.pl htmlFile1 [htmlFile2 ...] [>outFile]

スクリプトに複数の html ファイルを送信できます。最後のオプション パラメータは、出力をファイルに送信します。

cnn.comホームページを HTML ソースとして使用した部分的な出力:

www.huffingtonpost.com
a.visualrevenue.com
earlystart.blogs.cnn.com
reliablesources.blogs.cnn.com
insideman.blogs.cnn.com
cnnphotos.blogs.cnn.com
cnnpresents.blogs.cnn.com
i.cdn.turner.com
www.stylelist.com
js.revsci.net
z.cdn.turner.com
www.cnn.com
...

お役に立てれば!

于 2014-03-16T18:55:20.503 に答える