Форматирование текста веб-сканера

У меня есть следующий код для доступа к таблице HTML.

my $table = $tree->look_down(_tag => "table", id => "moduleDetail");

однако текст возвращается не отформатированным, поскольку веб-страница использует границы таблиц для разделения определенных фрагментов текста. Таким образом, происходит нечто вроде этого, "математика для вычислений Джорданстаун", где Джорданстаун находится в следующей ячейке. вот код, который я использую,

my @array; 
my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");




    for ($table ->look_down(_tag => 'tr')) {

                push(@array,$_->as_text());

    }

    foreach(@array){
           print $_, " ";
                    }
$tree->delete();

Обратите внимание, я пытался отделить текст с помощью массива, но не повезло? любые указатели. Спасибо

2 ответа

Решение

Использование HTML::TreeBuilder::XPath

Для этого я предлагаю использовать модуль Perl HTML::TreeBuilder::XPath. Это должно дать вам именно то, что вы хотите.

Из документации, я считаю, что ваш код будет выглядеть так, используя модуль XPath

my $tree = HTML::TreeBuilder::XPath->new_from_content($mech->content);
my @trArray = $tree->findnodes_as_string( '//table[@id="moduleDetail"]/tr/td');
$tree->delete();

Для получения дополнительной информации о XPath см. http://www.w3schools.com/xpath/.

Использование HTML:: TreeBuilder

Если вы хотите придерживаться использования HTML:: TreeBuilder, то вам нужно будет сделать следующее

my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
my $table = $tree->look_down(_tag => "table", id => "moduleDetail");
for ($table->look_down(_tag => 'td')) {
  push(@array,$_->as_text());   
}

Доступ к текстовым узлам дерева HTML становится намного проще, если вы вызываете objectify_text метод на дереве. Это изменяет текстовые узлы с простых строк на экземпляры HTML::Element с псевдотегом ~text и атрибут называется text равно текстовой строке. Это позволяет look_down метод для поиска текстовых узлов.

Если вы перекодируете таким образом, вы получите значение каждого отдельного текстового узла, помещенного в массив.

my $tree = HTML::TreeBuilder->new_from_content($mech->content);  
$tree->objectify_text;

my $table = $tree->look_down(_tag => "table", id => "moduleDetail");

my @text; 

for my $tr ($table->look_down(_tag => '~text')) {
  my $text = $tr->attr('text');
  push @text, $text if $text =~ /\S/;
}

print "$_\n" for @text;
Другие вопросы по тегам