Синтаксический анализ html с использованием Perl работает на 2 строки, но не на несколько

#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 ;