Игнорировать текст в HTML :: TreeBuilder Выходной Perl - PullRequest
0 голосов
/ 13 июня 2011

Мне нужно игнорировать или удалить весь текст между всеми элементами HTML, чтобы я мог создать пустой шаблон на заданной веб-странице.

Я выполняю синтаксический анализ с использованием модуля perl HTML :: TreeBuilder и HTML :: Element.

Я пробовал метод ignore_text, указанный в документации, но он не дает правильных результатов.

Я также пытался использовать DOMXpath с PHP, чтобы сделать то же самое, и результаты казались слишком громоздкими для управления. Регекс может работать, но это последнее средство для меня.

Это часть моего текущего кода, очень простая. Дно просто выводится в файл. Весь код работает, мне просто нужно форматирование, чтобы я мог генерировать файлы шаблонов.

my $url= "http://www.example.com";</p> <pre><code>my $page = get($url) or die $!; my $tree = HTML::TreeBuilder->new_from_content($page); $tree->parse_file($page); $tree->ignore_text; $tree->elementify; open OUTPUT, "+>".$body; my $output = $tree->as_HTML; print OUTPUT $output; close OUTPUT;

Заранее спасибо за помощь!

РЕДАКТИРОВАТЬ: Я обнаружил проблему - игнорировать текст работает только при разборе физического файла. Мне пришлось сохранить страницу как временный файл для анализа, а затем вывести его так, как я хотел, без текста, тогда я просто удалил ссылку ($ tmp) внизу, чтобы удалить файл. С тех пор мой сценарий стал намного сложнее с чтением и записью в базу данных, и каждый раз, когда мне нужно создать этот временный файл, который немного раздражает ...

Спасибо за ответ ниже!

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Вы очень близки.

Похоже, вам нужно установить ignore_text с истинным значением. $tree->ignore_text(1) и затем убедитесь, что он установлен перед вызовом parse_file.

Извините, это немного долго, но я надеюсь, что это поможет.

Вот быстрый переход к новому коду, который сложно протестировать без примера страницы:

my $tree = HTML::TreeBuilder->new;

$tree->ignore_text(1);
$tree->elementify;
$tree->parse_file( $page );

Вот мой скрипт быстрого теста с использованием локального файла:

use strict;
use warnings;

use HTML::TreeBuilder;

my $page = 'test.html';
my $tree = HTML::TreeBuilder->new();

$tree->ignore_text(1);
$tree->parse_file($page);
$tree->elementify;

print $tree->as_HTML;

Ввод test.html:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>title text</title>
</head>
<body>
  <h1>Heading 1</h1>
  <p>paragraph text</p>
</body>
</html>

И вывод:

<html xmlns="http://www.w3.org/1999/xhtml"><head><title></title></head><body><h1></h1><p></body></html>

Удачи

0 голосов
/ 14 июня 2011

Возможно, вам следует использовать HTML :: Parser для этой задачи. Это может быть немного больше кода, но не должно быть сложным.

...