Как один - в Perl - поток список URL-адресов из файла в массив, чтобы затем рекурсивно получить все свои данные HTML в одном файле?
Еще одно трудоемкое название... Извините... Во всяком случае, у меня есть файл с именем mash.txt
с кучей URL-адресов, как это в нем:
http://www...
http://www...
http://www...
.
.
.
Итак, на данный момент, я хотел бы передать эти (URL) в массив - возможно, без необходимости что-либо объявлять по пути - чтобы затем рекурсивно высосать данные HTML из каждого и добавить все это к одному и тому же файл - который, я думаю, нужно будет создать... Во всяком случае, заранее спасибо.
На самом деле, чтобы быть полностью готовым к выходу, я хотел бы соответствовать значениям (value
) под option
теги в каждом теге HTML этого документа, поэтому у меня нет всего этого мусора... То есть каждый из этих
http://www...
будет производить что-то вроде этого
<!DOCTYPE html>
<HTML>
<HEAD>
<TITLE>
DATA!
</TITLE>
</HEAD>
<BODY>
.
.
.
Все, чего я хочу от всего этого, это value
имя под option
тег, который встречается в каждом HTML в этом mash.txt
,
1 ответ
Следующее извлекает содержимое HTML для каждого URL-адреса в файле mash.txt, извлекает все значения всех параметров и помещает их в один массив. Результирующий массив затем передается в input.template, а обработанный вывод записывается в output.html:
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTML::TreeBuilder;
use Template;
my %values;
my $input_file = 'mash.txt';
my $input_template = 'input.template';
my $output_file = 'output.html';
# create a new lwp user agent object (our browser).
my $ua = LWP::UserAgent->new( );
# open the input file (mash.txt) for reading.
open my $fh, '<', $input_file or die "cannot open '$input_file': $!";
# iterate through each line (url) in the input file.
while ( my $url = <$fh> )
{
# get the html contents from url. It returns a handy response object.
my $response = $ua->get( $url );
# if we successfully got the html contents from url.
if ( $response->is_success )
{
# create a new html tree builder object (our html parser) from the html content.
my $tb = HTML::TreeBuilder->new_from_content( $response->decoded_content );
# fetch values across options and push them into the values array.
# look_down returns an array of option node objects, which we translate to the value of the value attribute via attr upon map.
$values{$_} = undef for ( map { $_->attr( 'value' ) } $tb->look_down( _tag => 'option' ) );
}
# else we failed to get the html contents from url.
else
{
# warn of failure before next iteration (next url).
warn "could not get '$url': " . $response->status_line;
}
}
# close the input file since we have finished with it.
close $fh;
# create a new template object (our output processor).
my $tp = Template->new( ) || die Template->error( );
# process the input template (input.template), passing in the values array, and write the result to the output file (output.html).
$tp->process( $input_template, { values => [ keys %values ] }, $output_file ) || die $tp->error( );
__END__
input.template может выглядеть примерно так:
<ul>
[% FOREACH value IN values %]
<li>[% value %]</li>
[% END %]
</ul>