【问题标题】:HTML::TagFilter remove div based on classHTML::TagFilter 根据类删除 div
【发布时间】:2012-06-04 20:17:53
【问题描述】:

我正在尝试使用 perl 脚本从服务器上的静态 html 文件中提取内容。我想提取特定 div 的内容。我通过类名(“getme”)知道 div。 我可以使用 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);

过滤器只是删除类属性。是否可以制定规则来删除整个标签,或者有​​更好的方法吗?

【问题讨论】:

  • 你想要什么输出? &lt;div&gt; 标记内的 HTML,或者文本节点,还是别的什么?
  • 我希望在节点中看到 html。 &lt;h2&gt;Some Header&lt;/h2&gt; &lt;div class="another"&gt;&lt;p&gt;More text&lt;/p&gt;&lt;/div&gt; &lt;div class="yetanother"&gt;text text text&lt;/div&gt; 我想稍后在另一个进程中重用 html。

标签: perl html-parsing html-tree


【解决方案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>

【讨论】:

  • 谢谢。我刚刚在 OP cmets 中阐明了我的意图。我想获取 div 的 html 内容。
  • 谢谢。即使我使用的是“.getme > *”选择器,我也只是出于某种原因得到第一个孩子。 RHEL 上的 perl 5.8.8。
  • 显然对我有用。要排除模块中的旧错误,请升级Web::Query's dependencies
猜你喜欢
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2020-07-13
  • 2018-09-07
  • 2013-07-17
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
相关资源
最近更新 更多