回答:
HTML-XML-utilsののほとんどの主要なLinuxディストリビューションで利用可能なパッケージは、HTMLやXML文書を扱うときに便利なツールがいくつかあります。特に便利なのは、hxselect
標準入力から読み取り、CSSセレクターに基づいて要素を抽出することです。ユースケースは次のようになります。
hxselect '#the_div_id' <file
入力内容によっては、入力が適切に形成されていないという苦情を受け取る場合があります。この苦情は標準エラーに渡されるため、必要に応じて簡単に抑制できます。これに代わる方法は、PerlのHTML :: PARSERパッケージを使用することです。ただし、それは私よりも錆びにくいPerlスキルを持つ人に任せます。
以下は、<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 正規表現を使用しないでください。。
以下は、各ファイルからその部分を抽出する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
)でもないかもしれませんが、動作するはずです。
hxselect
は、入力形式についてよりうるさいですpup
。たとえば、私はちょうどそれを解析する 場所で取得Input is not well-formed. (Maybe try normalize?)
しています。hxselect
pup