
何百ものHTMLソースコードファイルがあります。各ファイルから特定の要素のコンテンツを抽出する必要があるため、<div>
各ファイルを繰り返すスクリプトを作成します。要素構造は次のとおりです。
<div id='the_div_id'>
<div id='some_other_div'>
<h3>Some content</h3>
</div>
</div>
the_div_id
Linuxコマンドラインを使用してファイルからdivとすべての子要素とコンテンツを抽出する方法を提案できる人はいますか?
答え1
これhtml-xml-utilsこのパッケージは、ほとんどの主要なLinuxディストリビューションで利用可能であり、HTMLおよびXMLドキュメントの操作に役立つ多くのツールが含まれています。あなたの場合に特に便利なのは、hxselect
標準入力から読み取ってCSSセレクタに基づいて要素を抽出することです。使用例は次のとおりです。
hxselect '#the_div_id' <file
お客様が提供した内容によっては、誤った入力形式に関する苦情が発生することがあります。この苦情は標準エラーに対して提供されるため、必要に応じて簡単に抑制できます。代わりに、PerlのHTML :: PARSERパッケージを使用することです。しかし、私はこれを私よりもPerlの技術があまり錆びていない人に任せます。
答え2
努力するpup
、HTML処理用のコマンドラインツールです。たとえば、
pup '#the_div_id' < file.html
答え3
<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
。
ポリスチレン正規表現を使用しようとしないでください。。
答え4
以下は、各ファイルからそのセクションを抽出する前の行です。
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
)、しかし動作するはずです。