如何在Shell中解析数​​百个html源代码文件?


23

我有数百个html源代码文件。我需要<div>从每个文件中提取特定元素的内容,因此我将编写一个脚本来遍历每个文件。元素结构如下:

<div id='the_div_id'>
  <div id='some_other_div'>
  <h3>Some content</h3>
  </div>
</div>

谁能建议我the_div_id一种使用linux命令行从文件中提取div 以及所有子元素和内容的方法?

Answers:


27

HTML-XML-utils的包,在大多数主要Linux发行版,拥有一批具有HTML和XML文档打交道时非常有用的工具。对于您的情况特别有用的是hxselect从标准输入读取并基于CSS选择器提取元素。您的用例如下所示:

hxselect '#the_div_id' <file

您可能会因输入内容不正确而抱怨输入格式不正确。这种抱怨是由于标准错误引起的,因此,如果需要可以轻松地加以解决。替代方法是使用Perl的HTML :: PARSER包;但是,我会将其留给Perl技能不如我自己生锈的人。


1
hxselect对输入格式比pup。举例来说,我得到Input is not well-formed. (Maybe try normalize?)hxselect 在那里pup只是解析它。
AB


4

这是未经测试的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 请勿尝试使用正则表达式。



1

这是从每个文件中提取该部分的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),但是它应该可以工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.