【问题标题】:Ignore Text in HTML::TreeBuilder Output Perl忽略 HTML::TreeBuilder 输出 Perl 中的文本
【发布时间】:2011-09-13 15:56:45
【问题描述】:

我需要忽略或删除所有 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;

提前感谢您的帮助!

编辑:我发现了问题 - 忽略文本仅在您从物理文件解析时才有效。我必须将页面保存为临时文件以进行解析,然后以我想要的方式输出没有文本,然后我只是在底部做了 unlink($tmp) 来删除文件。此后,我的脚本在读取和写入数据库时​​变得更加复杂,每次我需要创建这个临时文件时,这有点烦人......

感谢下面的回复!

【问题讨论】:

  • 与其提议编辑以提供解决方案,不如删除问题或将您的解决方案作为答案发布(然后您可以接受),以便人们将来可以从中受益。您可能想阅读FAQ 以了解有关 SO 工作原理的更多信息。 :)

标签: perl html-parsing perl-module


【解决方案1】:

你们很亲密。

您似乎需要将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>

祝你好运

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-01-23
      • 2014-08-25
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多