Разбор HTML с использованием Perl работает на 2 строки, но не несколько - PullRequest
2 голосов
/ 07 октября 2011

Я написал следующий скрипт на Perl-

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new_from_content(<<END_HTML);

<span class=time>1 h </span> 
<a href="http://foo.com/User">User</a>: There are not enough <b>big</b>
<b>fish</b> in the lake ;
END_HTML

my $source   = "foo";
my @time     = "10-14-2011";
my $name     = $html->find('a')->as_text;  
my $comment  = $html->as_text;
my @keywords = map { $_->as_text } $html->find('b');

Какие выходы- foo, 10-14-2011, User, 1h User: There are not enough big fish in the lake, big fish Что идеально и что я хотел от теста HTML, но это работает нормально только тогда, когда я вставил вышеупомянутый HTML, что я сделал для целей тестирования.

Однако полный HTML-файл содержит несколько ссылок «a» и «b» для экземпляров, поэтому при печати результаты для этих столбцов будут пустыми.

Как я могу учесть несколько значений для определенных поисков?

1 Ответ

0 голосов
/ 11 ноября 2011

Без вашего реального HTML трудно помочь, но $html->find возвращает список <a> элементов, так что вы можете написать что-то вроде

foreach my $anchor ($html->find('a')) {
  print $anchor->as_text, "\n";
}

Но это найдет все <a> элементов, и вряд ли это то, что вы хотите.$ html-> look_down () гораздо более гибок и обеспечивает поиск по атрибуту, а также по имени тега.

Я не могу начать догадываться о вашей проблеме с комментариями, не видя, с какими данными вы имеете дело.


Если вам нужно обрабатывать каждый текстовый элемент независимо, то вам, вероятно, нужно вызвать метод objectify_text.Это превращает каждый текстовый элемент в дереве в псевдоэлемент с именем тега ~text и атрибутом text, например <p>paragraph text</p> будет преобразован в <p><~text text="paragraph text" /></p>.Эти элементы могут быть обнаружены с использованием $html->find('~text') как обычно.Вот код для демонстрации

use strict;
use warnings;

use HTML::TreeBuilder;

my $html = HTML::TreeBuilder->new_from_content(<<END_HTML);

<span class=time>1 h </span> 
<a href="http://foo.com/User">User</a>: There are not enough <b>big</b>
<b>fish</b> in the lake ;
END_HTML

$html->objectify_text;
print $_->attr('text'), "\n" for $html->find('~text');

ВЫХОД

1 h 

User
: There are not enough 
big

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