2011-06-13 55 views
0

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

我解析使用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; 

在此先感谢您的帮助!

编辑:我发现了问题 - 忽略文本只适用于从物理文件解析。我不得不将页面保存为一个临时文件来解析然后输出我想要的文本,然后我只是在底部取消链接($ tmp)来删除文件。我的脚本随着阅读和写入数据库变得越来越复杂,每次我需要创建这个令人讨厌的临时文件...

感谢您的回复!

+1

而是提出一个编辑提供解决方案,无论是删除的问题或发表您的解决方案作为一个答案(然后你就可以接受),使人们可以从它在未来受益。您可能需要阅读[FAQ](http://stackoverflow.com/faq)以了解更多关于SO如何工作的信息。 :) – 2011-07-01 02:42:56

回答

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

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