外部HTMLを含むリンクを取得する

外部HTMLを含むリンクを取得する

リンクの多い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

grepHTML-source-file与えられたパターンを検索しますhttps://always/same/link/same-name_([0-9]+)\.html。このパターンは、次の要素で構成されるすべての文字列と一致します(順番に)。

  1. https://always/same/link/same-name_
  2. 0から9までの数字
  3. .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

おすすめ記事