Извлекать текст <td> при использовании WWW::Mechanize для извлечения <a> из этого тега <td>
Я новичок в вещах Perl-HTML. Я пытаюсь получить как тексты, так и ссылки из таблицы HTML.
Вот структура HTML:
<td>Td-Text
<br>
<a href="Link-I-Want" title="title-I-Want">A-Text</a>
</td>
Я понял, что WWW::Mechanize - это самый простой модуль для извлечения нужных мне вещей из <a>
часть, но я не уверен, как получить текст от <td>
, Я хочу, чтобы две задачи происходили вплотную, потому что мне нужно соединить каждую ячейку <td>-Text
с соответствующим <a>-Text
в массиве хэшей.
Любая помощь будет высоко ценится!
Z.Zen
2 ответа
WWW:: Mechanize хорош для извлечения ссылок, но если вам нужно получить другой текст, я обычно комбинирую его с HTML:: TreeBuilder. Что-то вроде этого:
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_content($mech->content);
foreach my $td ($tree->look_down(_tag => 'td')) {
# If there's no <a> in this <td>, then skip it:
my $a = $td->look_down(_tag => 'a') or next;
my $tdText = $td->as_text;
my $aText = $a->as_text;
printf("td-text: %s\n a-text: %s\nhref: %s\ntitle: %s\n",
$tdText, $aText, $a->attr('href'), $a->attr('title'));
}
Единственная проблема с этим кодом состоит в том, что вы не хотите, чтобы весь текст в <td>
тег. Как вы исправите это зависит от вас. Если $aText
достаточно уникален, вы можете сделать что-то вроде:
$tdText =~ s/\Q$aText\E.*//s;
В худшем случае вам придется написать собственную функцию для извлечения нужных текстовых элементов, остановившись на <br>
(или, тем не менее, вы определяете точку остановки).
Я обнаружил, что HTML::TreeBuilder - отличный способ разбора HTML-документов и извлечения информации из них. В этом случае что-то вроде:
use HTML::TreeBuilder;
my $page = get($URL);
my $tree = HTML::TreeBuilder->new_from_content($page);
foreach my $cell ($tree->look_down(_tag => "td")) {
my $links = $cell->extract_links();
foreach my $link (@$links) {
print "href: ", $link->attr("href"), "; text: ", $link->as_text, "\n";
}
}
$tree = $tree->delete;
Ресурсы