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");

これを修正する 1 つの方法は、ループ内の各値が処理前にファイルであることを確認することです。このようなもの

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 に答える