Answers:
在HTML-XML-utils的包,在大多数主要Linux发行版,拥有一批具有HTML和XML文档打交道时非常有用的工具。对于您的情况特别有用的是hxselect
从标准输入读取并基于CSS选择器提取元素。您的用例如下所示:
hxselect '#the_div_id' <file
您可能会因输入内容不正确而抱怨输入格式不正确。这种抱怨是由于标准错误引起的,因此,如果需要可以轻松地加以解决。替代方法是使用Perl的HTML :: PARSER包;但是,我会将其留给Perl技能不如我自己生锈的人。
这是未经测试的Perl脚本,可使用提取<div id="the_div_id">
元素及其内容HTML::TreeBuilder
。
#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TreeBuilder;
foreach my $file_name (@ARGV) {
my $tree = HTML::TreeBuilder->new;
$tree->parse_file($file_name);
for my $subtree ($tree->look_down(_tag => "div", id => "the_div_id")) {
my $html = $subtree->as_HTML;
$html =~ s/(?<!\n)\z/\n/;
print $html;
}
$tree = $tree->delete;
}
如果您对Perl过敏,Python提供了HTMLParser
。
PS 请勿尝试使用正则表达式。。
这是从每个文件中提取该部分的Ex一线:
ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html
要就地保存/替换,请更改-cqa!
为“ -cxa
并删除” %p
部分。为了递归,请考虑使用globlob(**/*.html
)。
基本上,每个缓冲区/文件(bufdo
)都会执行以下操作:
/pattern
-找到图案norm
-开始模拟正常的Vi击键
n
-跳到下一个模式(在Ex模式下需要)vatd
-删除选定的外部标签部分(请参阅:在html标签之间跳转)ggdG
-删除整个缓冲区(相当于:%d
)"2p
-重新粘贴之前删除的文本也许效率不是很高,并且不是POSIX(:bufdo
),但是它应该可以工作。
hxselect
对输入格式比pup
。举例来说,我得到Input is not well-formed. (Maybe try normalize?)
与hxselect
在那里pup
只是解析它。