Получить текст ‹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 в хэш-массиве.

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

З.Дзен


person Z.Zen    schedule 10.09.2010    source источник


Ответы (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> (или как вы определите точку остановки).

person cjm    schedule 10.09.2010
comment
В дополнение к этому я могу порекомендовать search.cpan.org/dist/HTML-TreeBuilder -LibXML, который является расширением HTML-TreeBuilder, которое также дает программисту всю мощь XPath и LibXML. В последнее время я часто использую его для тестирования HTML-страниц. - person Shlomi Fish; 11.09.2010

Я обнаружил, что 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;

Ресурсы

person zigdon    schedule 10.09.2010
comment
Эммм... extract_links работает не так, как вы думаете. Возвращаемое значение представляет собой ссылку на массив ссылок на массив, а не ссылку на массив элементов. - person cjm; 11.09.2010