シェルで何百ものHTMLソースコードファイルを解析する方法は?


23

数百のHTMLソースコードファイルがあります。<div>これらの各ファイルから特定の要素の内容を抽出する必要があるため、各ファイルをループするスクリプトを作成します。要素の構造は次のとおりです。

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

the_div_idlinuxコマンドラインを使用してファイルからdiv とすべての子要素とコンテンツを抽出する方法を提案できる人はいますか?

回答:


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?)しています。hxselectpup
AB


4

以下は、<div id="the_div_id">を使用して要素とそのコンテンツを抽出するテストされていないPerlスクリプトです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
AB

1

以下は、各ファイルからその部分を抽出するEx one-linerです。

ex -s +'bufdo!/<div.*id=.the_div_id/norm nvatdggdG"2p' +'bufdo!%p' -cqa! *.html

インプレースで保存/置換するには、セクションに変更-cqa!-cxaて削除し%pます。再帰性については、グロビング(**/*.html)の使用を検討してください。

基本的に、各バッファ/ファイル(bufdo)に対して、次のアクションを実行します。

  • /pattern -パターンを見つける
  • norm -通常のViキーストロークのシミュレーションを開始します
    • n -次のパターンにジャンプする(Exモードで必要)
    • vatd-選択した外部タグセクションを削除します(htmlタグ間のジャンプを参照)
    • ggdG-バッファ全体を削除します(と同等:%d
    • "2p -以前に削除したテキストを再貼り付け

たぶんあまり効率的ではなく、POSIX:bufdo)でもないかもしれませんが、動作するはずです。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.