1

perlスクリプトを使用して、サーバー上の静的htmlファイルからコンテンツをプルしようとしています。特定のdivのコンテンツを取得したいのですが。私はdivをそのクラス名( "getme")で知っています。HTML ::TreeBuilder->look_downを使用してdivにアクセスできます。どうすればdivタグを削除して、その中のコンテンツだけにアクセスできますか?

HTMLの例

<body>
<div class="getme">
    <h2>Some Header</h2>
    <div class="another"><p>More text</p></div>
    <div class="yetanother">text text text</div>
</div>
<div class="second">...</div>
</body>

これまでのPerl

use strict;
use warnings;
use HTML::TreeBuilder;
use HTML::TagFilter;

my $unique_filename = '/path/to/saved/files/extracted_divs/' . get_timestamp();
my $guid_counter = 0;
my $field_sep = "|";

open FILEOUT, ">>", $unique_filename or die $!;

print FILEOUT "guid|published|url|title|body\n";
foreach my $file_name (@ARGV) {
    my $tree = HTML::TreeBuilder->new;
    my $filter = HTML::TagFilter->new(deny => { div => {class => ["getme"]} });
    $tree->parse_file($file_name);
    for my $subtree ($tree->look_down(_tag => "div", class => "getme")) {
        #my $html = $filter->filter($subtree->as_HTML);
        my $html = $subtree->as_HTML;
        #steamline HTML
        $html =~ s/(?<!\n)\z/\n/;
        #echo file name to screen so we know something is happening
        print $file_name . "\n";

        #replace slashes with spaces
        my $file_url = $file_name;
        $file_name =~ s/\//-/g;
        #remove ".html"
        $file_name =~ s/.html//g;

        #echo info to output file
        print FILEOUT $guid_counter++ . $field_sep . time . $field_sep;
        print FILEOUT $file_url . $field_sep . $file_name . $field_sep;
        print FILEOUT $html;
    }
    $tree = $tree->delete;
}
close (FILEOUT);

フィルタは、クラス属性を削除するだけです。タグ全体を削除するルールを作成できますか、それともこれに対するより良いアプローチがありますか?

4

1 に答える 1

1
use Web::Query qw();
join '', Web::Query->new_from_html($html)->find('.getme > *')->html

文字列を返します

<h2>Some Header</h2><div class="another"><p>More text</div><div class="yetanother">text text text</div>
于 2012-05-30T15:20:21.813 に答える