bash - 複数のリンクを含むhtmlファイルからファイル名を抽出する

bash - 複数のリンクを含むhtmlファイルからファイル名を抽出する

Webページのスクリプトによって自動的に生成されるhtmlファイルをダウンロードしました。ファイルに画像リンクを含む複数のリンクが含まれています。画像のフルネームを抽出しようとしています。

<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>

上から"Image name.jpg"ファイルに保存したいです。そのような名前は何百ものあるため、ファイルを解析し、次のコマンドを使用して表示されるように各名前を保存します。

grep -i -E -o "target=\"_blank\">([[:graph:]]*)\.(jpg|png|gif|webm)" "$thread" | cut -f 2 -d '>' | sed 's/ /_/g' - > "$names"

ここで、 " $thread"はhtmlファイルの名前、 " $names"は出力されるファイル名のリストです。 " "を使用してその部分を削除cutし、'target="_blank">'スペースをアンダースコアに変換します。

ファイルに異なるリンクが複数あるため、クロールする拡張子(imageとwebm)を指定しました。他のすべては無視する必要があります。これらのリンクだけがクロールされましたが、一部のリンクが欠落しているポイントに達しました。

一部のファイルには、スペースと英数字以外の文字が含まれています。これらすべてのケースをカバーする必要があるwhichを使用すると、何も得られないか、html部分[[:print:]]だけが得られ、他のものは何も得られません。<head>使用すると[[:graph:][:space:]]何も得られません。[[:graph:]]上記のように使用したり、[[:alnum:][:punct:]]英数字/その他の文字( "")を含むfilenamewith(parenthesis).jpgファイルをインポートしたりできますが、空白は含まれていないか、その逆の場合は[[:alnum:][:space:]]機能しますが、印刷可能な他の文字を無視します( " file name with spaces.jpg"は機能しますが "一緒に"は使用しません)(括弧、カンマ、またはその他.jpg")。

すべての場合を包括するというのです[[:print:]]が、私が正しく理解したら必要なものを得られません。

grep -E -o(上記に基づいて)一致する必要があります: *.jpg *.png *.gifまたは*.webm

grep私は持っているかどうか、-E/-o/-eさまざまなバリエーションを試しました。

どんなアイデアがありますか?私はArch Linux、grep 2.20、bash 4.3.18を使用しています。

ベストアンサー1

最良の戦略は、<a>すべてのタグの値を出力できる適切なHTMLパーサーを使用することです。

これはxmlstarlet特にXMLパーサーです。 HTMLは正しい形式のXMLではないかもしれませんが、おそらく次のアイデアを得ることができます。

echo '<html>
<a href="000000.jpg" title="image name.jpg" target="_blank">Image name.jpg</a>
</html>' | xmlstarlet sel -t -v //a
Image name.jpg

おすすめ記事