0

我正在尝试从几个 HTML 文件中删除所有表格元素。

以下代码在单个文件上完美运行,但在尝试自动化该过程时,它返回错误

无法对未定义的值调用方法“look_down”

请问您有什么解决办法吗?

这是代码:

use strict;
use warnings;

use Path::Class;
use HTML::TreeBuilder;

opendir( DH, "C:/myfiles" );
my @files = readdir(DH);
closedir(DH);

foreach my $file ( @files ) {

    print("Analyzing file $file\n");

    my $tree = HTML::TreeBuilder->new->parse_file("C:/myfiles/$file");

    foreach my $e ( $tree->look_down( _tag => "table" ) ) {
        $e->delete();
    }

    use HTML::FormatText;
    my $formatter = HTML::FormatText->new;
    my $parsed    = $formatter->format($tree);

    print $parsed;
}
4

1 回答 1

1

问题是HTML::TreeBuilder除了您想要的 HTML 文件之外,您还提供了各种垃圾。以及打开目录中的任何文件,readdir返回所有子目录的名称,以及伪目录.... 您应该在print语句的输出中看到了这一点

print("Analyzing file $file\n");

解决此问题的一种方法是在处理之前检查循环中的每个值是否是一个文件。像这样的东西

for my $file ( @files ) {

    my $path = "C:/myfiles/$file";
    next unless -f $path;

    print("Analyzing file $file\n");

    my $tree = HTML::TreeBuilder->new->parse_file($path);

    for my $table ( $tree->look_down( _tag => 'table' ) ) {
        $table->delete();
    }

    ...;
}

但是使用对glob. 这样你只会得到你想要的文件,也不需要构建每个文件的完整路径

那看起来像这样。如果您的文件并非全部以.html

for my $path ( glob "C:/myfiles/*.html" ) {

    print("Analyzing file $path\n");

    my $tree = HTML::TreeBuilder->new->parse_file($path);

    for my $table ( $tree->look_down( _tag => 'table' ) ) {
        $table->delete();
    }

    ...;
}

严格来说,目录名称也可能看起来像*.html,如果您不信任您的文件结构,您还应该glob在处理它之前测试每个结果是一个文件。但是在正常情况下,您知道您正在处理的目录中的内容是不必要的

于 2016-01-31T18:19:59.447 回答