Шаблон извлечения Perl из HTML-файла
У меня есть.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
}
2 ответа
Лично для этого я бы использовал 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)
Вот еще один вариант:
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
...
Надеюсь это поможет!