#html #perl
#HTML #perl
Вопрос:
Я написал следующий сценарий 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. Можете ли вы добавить ссылку на полный HTML-файл?
2. не могли бы вы уточнить, пожалуйста, @mob? Я мог бы опубликовать больший фрагмент html?
3.
$html->warn(1)
включает предупреждения о синтаксических ошибках в исходном HTML. Используйте его, чтобы исключить возможность того, что ваш код не работает, потому что ввод неровный.4. правильно, я разобрал свою первоначальную проблему, однако как я мог создавать новую строку после каждого нового комментария? Он выходит как одна массивная строка
5. @Jambo: вы должны иметь возможность редактировать свой вопрос.
Ответ №1:
Без представления вашего реального 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 ;