
リンクの多いhtmlページから特定の形式に従うリンクのみを抽出する方法を探しています。
<a href="https://always/same/link/same-name_19.html">always same text</a>
<a href="https://always/same/link/same-name_18.html">always same text</a>
<a href="https://always/same/link/same-name_17.html">always same text</a>
grep
そして他の解決策を使って多くの解決策を見つけsed
ましたが、すべてhtmlタグと「常に同じテキスト」の部分なしで内部リンクのみを返します。
コマンドライン/bashスクリプトで動作する必要があります。私はDebian Jessieを使用しています。解決策が一方通行である必要はありません。
修正する
Ryan's Answerの助けを借りて作られたスクリプトです。
Curl=https://always/same/link/
filename=same-name
page=`curl "$Curl$filename"`
echo $page > $filename.curl
Gurl=https://always/same/link/
# working
link=`grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' $filename.curl | sort | tail -n1`
# not working; $link will be empty
link=`grep -Eo "<a href=\"https://always/same/link/same-name_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1`
# not working; $link will be empty
link=`grep -Eo "<a href=\"${Gurl}${filename}_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1`
# what i ended up using.
link=`grep -Eo '<a href="'${Gurl}${filename}'_([0-9]+)\.html\">always same text</a>' $filename.curl | sort | tail -n1`
echo $link | grep -o 'https:.*[.]html'
答え1
ほとんどのhref属性は常に同じで、内部テキストも常に同じで、HTMLソースファイルがあると仮定すると、次のように動作します。
grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' HTML-source-file
grep
HTML-source-file
与えられたパターンを検索しますhttps://always/same/link/same-name_([0-9]+)\.html
。このパターンは、次の要素で構成されるすべての文字列と一致します(順番に)。
- https://always/same/link/same-name_
- 0から9までの数字
- .html
この-E
フラグは、grep
パターンを拡張正規表現として解釈するよう指示します。
この-o
フラグは、grep
パターンに一致するテキストのみを出力するように指示します。
変数を使用するには、正規表現の周囲に二重引用符を使用して二重引用符をエスケープします。~へ次のようにバックスラッシュを使用し、変数名を中括弧で囲む正規表現です。
$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo "<a href=\"${link_path}${link_name}_([0-9]+)\.html\">always same text</a>" HTML-source-file
何らかの理由で上記のgrep
二重引用符をエスケープできない場合は、次のようにすることもできます。
$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo '<a href="'${link_path}${link_name}'_([0-9]+)\.html">always same text</a>' HTML-source-file