Как извлечь данные из таблиц HTML в Perl? - PullRequest
5 голосов
/ 30 октября 2009

Возможный дубликат:
Можете ли вы привести пример разбора HTML с вашим любимым парсером?
Как извлечь содержимое из файлов HTML с помощью Perl?


Я пытаюсь использовать регулярные выражения в Perl для анализа таблицы со следующей структурой. Первая строка выглядит следующим образом:

<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr>

Здесь я хочу вынуть «Время воспроизведения», «Исполнитель», «Заголовок» и «Метка» и распечатать их в выходной файл.

Любая помощь будет высоко ценится!

Хорошо, извините ... Я пробовал много регулярных выражений, таких как:

$lines =~ / (<td>) /
       OR
$lines =~ / <td>(.*)< /
       OR
$lines =~ / >(.*)< /

Моя текущая программа выглядит так:

#!perl -w

open INPUT_FILE, "<", "FIRST_LINE_OF_OUTPUT.txt" or die $!;

open OUTPUT_FILE, ">>", "PLAYLIST_TABLE.txt" or die $!;

my $lines = join '', <INPUT_FILE>;

print "Hello 2\n";

if ($lines =~ / (\S.*\S) /) {
print "this is 1: \n";
print $1;
    if ($lines =~ / <td>(.*)< / ) {
    print "this is the 2nd 1: \n";
    print $1;
    print "the word was: $1.\n";
    $Time = $1;
    print $Time;
    print OUTPUT_FILE $Time;
    } else {
    print "2ND IF FAILED\n";
    }
} else { 
print "THIS FAILED\n";
}

close(INPUT_FILE);
close(OUTPUT_FILE);

Ответы [ 3 ]

16 голосов
/ 30 октября 2009

НЕ используйте регулярные выражения для разбора HTML. Существует очень большое количество модулей CPAN, которые делают это для вас гораздо эффективнее.

11 голосов
/ 30 октября 2009

Использовать HTML :: TableExtract . На самом деле.

#!/usr/bin/perl

use strict;
use warnings;

use HTML::TableExtract;
use LWP::Simple;

my $file = 'Table3.htm';
unless ( -e $file ) {
    my $rc = getstore(
        'http://www.ntsb.gov/aviation/Table3.htm',
        $file);
    die "Failed to download document\n" unless $rc == 200;
}

my @headers = qw( Year Fatalities );

my $te = HTML::TableExtract->new(
    headers => \@headers,
    attribs => { id => 'myTable' },
);

$te->parse_file($file);

my ($table) = $te->tables;

print join("\t", @headers), "\n";

for my $row ($te->rows ) {
    print join("\t", @$row), "\n";
}

Это то, что я имел в виду в другом посте под "специфичными для задачи" парсерами HTML.

Вы могли бы сэкономить много времени, направляя свою энергию на чтение некоторой документации, а не бросая регулярные выражения в стену и проверяя, не застряли ли они.

0 голосов
/ 30 октября 2009

Это просто:

my $html = '<tr class="Highlight"><td>Time Played</a></td><td></td><td>Artist</td><td width="1%"></td><td>Title</td><td>Label</td></tr>';
my @stuff = $html =~ />([^<]+)</g;
print join (", ", @stuff), "\n";

См. http://codepad.org/qz9d5Bro, если хотите попробовать запустить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...