忽略HTML :: TreeBuilder输出Perl中的文本

时间:2011-06-13 03:44:29

标签: perl html-parsing perl-module

我需要忽略或删除所有HTML元素之间的所有文本,以便我可以从给定的网页生成空白模板。

我正在使用perl模块HTML :: TreeBuilder和HTML :: Element进行解析。

我已经尝试过文档中提到的ignore_text方法,但是没有提供正确的结果。

我也尝试过使用DOMXpath与PHP做同样的事情,结果似乎太麻烦了。正则表达式可能会起作用,但对我来说是最后的手段。

这是我当前代码的一部分,非常基本。底部只是输出到文件。所有代码都是可用的我只需要格式化就可以工作,所以我可以生成模板文件。

my $url= "http://www.example.com";

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;

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 :(得分:0)

你非常接近。

看起来您需要将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>
祝你好运

答案 1 :(得分:-1)

也许你应该使用HTML :: Parser来完成这项任务。它可能是更多的代码,但不应该复杂。