2015-04-09 1 views
1

Я пытаюсь извлечь содержимое HTML, содержащееся в < td> тегах, соответствующих классу «tablehead1».Perl: Извлечение элемента HTML с определенным классом с помощью HTML :: TokeParser

< td class="tablehead1"> Market </td> 

В процессе анализа я получаю все текстовое содержимое < TD> теги, присутствующие в целом HTML-файл. Но мне нужно только содержимое в тегах < td> с конкретным классом «tablehead1».

Где я ошибаюсь в приведенном ниже коде?

use HTML::TokeParser; 

open(DATA,"<KeyStats.html") or die "Can't open data"; 
my $p = HTML::TokeParser->new(*DATA); 

while (my $token = $p->get_tag('td')) { 

my $url = $token->[1]{class} || "tablehead1"; 
my $text = $p->get_trimmed_text("/td"); 

if (length($text)<30&&length($text)>0) { print "$text\n"; } 
} 
+0

Используйте [HTML :: TableExtract] (http://www.nu42.com/2012/04/htmltableextract-is-beautiful.html). –

+0

Также 'length ($ text) <30 && length ($ text)> 0' является мерзостью. Я не знаю недостатка в пробельных символах. Плюс '$ text и (длина ($ text) <30)' намного лучше. –

ответ

1

Вы на самом деле не выполняют проверку ли class действительно tablehead1.

Заменить

my $url = $token->[1]{class} || "tablehead1"; 

по

next unless $token->[1]{class} eq "tablehead1"; 

должен дать вам ожидаемые результаты. Кроме того, вы должны добавить проверку, действительно ли у фактического <td> есть ключ class, например. по

next unless grep(/^class$/, @{$token->[2]}) && $token->[1]{class} eq "tablehead1"; 
Смежные вопросы