8

次のような HTML 出力からデータを取得しようとしています。

<strong>Target1NoSpaces</strong><span class="creator"> ....
<strong>Target2 With Spaces</strong><span class="creator"> ....

パイプトレインを使用して、ヒットしようとしているターゲットにデータを絞り込んでいます。これまでの私のアプローチは次のとおりです。

grep "/strong" output.html | awk '{print $1}'

「/strong」を grep して、ターゲットの行を取得します。それはうまくいきます。

「awk '{print $1}」にパイプします。ターゲットにスペースがない場合は #1 で動作しますが、ターゲットにスペースがある場合は #2 で失敗します。次のように最初の単語のみが保持されます。

<strong>Target1NoSpaces</strong><span
<strong>Target2

私のawkまたは別のコマンドで、ターゲットを適切にヒットするためのヒントはありますか? 手っ取り早いもの (grep、awk、sed、perl) を歓迎します。

4

7 に答える 7

7

一方向の使用mojoliciousとそのDOMパーサー:

perl -Mojo -E '
    g("http://your.web")
    ->dom
    ->find("strong")
    ->each( sub { if ( $t = shift->text ) { say $t } } )'
于 2013-09-11T17:02:08.110 に答える
6

grep で Perl 正規表現の後読み機能と先読み機能を使用します。awk を使用するよりも簡単なはずです。

grep -oP "(?<=<strong>).*?(?=</strong>)" file

出力:

Target1NoSpaces
Target2 With Spaces

追加:

Ruby での Perl の正規表現のマルチマッチングのこの実装は、複数の行の値に一致する可能性があります。

ruby -e 'File.read(ARGV.shift).scan(/(?<=<strong>).*?(?=<\/strong>)/m).each{|e| puts "----------"; puts e;}' file

入力:

<strong>Target
A
B
C
</strong><strong>Target D</strong><strong>Target E</strong>

出力:

----------
Target
A
B
C
----------
Target D
----------
Target E
于 2013-09-11T16:54:29.820 に答える
4

xmlstarletを使用したソリューションは次のとおりです

xml sel -t -v //strong input.html
于 2013-09-11T19:50:40.213 に答える