Форматирование текста веб-сканера
У меня есть следующий код для доступа к таблице 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;