不完全なリンク配列の修正

不完全なリンク配列の修正

ページ上のリンクを検索するbashスクリプトを作成しています。ページからソースコードをダウンロードし、その中のリンクを見つけます。タグを付けて配列に保存します。$link。ただし、問題は、一部のリンクには完全なURLが含まれておらず、サブページまたはファイルのみが含まれることです。ページのソースコードが次のとおりです。

<h1>Julian's crappy webpage</h1>
<a href="http://one.com">Page One</a>
<a href="https://two.com">Page Two</a>
<a href="/three">Page Three</a>
<a href="four">Page Four</a>

リンクが見つかると、配列は次のようになります。

http://one.com
https://two.com
/three
four

私も変数があります$urlこれは ' のような有効な URL です。https://google.com

すべてのアイテムを作成する方法が必要です。$linkプロジェクトによって異なることをすることが効果的です。各項目について$link:

  • エントリが/で始まる場合は、次のものをマージします。$url+${リンク[n]}
  • エントリが「/」、「https://」、または「http://」で始まらない場合は、次のものを組み合わせてください。$url+"/"+${リンク[n]}

たとえば、上記の期待される応答は次のとおりです。

http://one.com
https://two.com
https://google.com/three
https://google.com/four

答え1

これを達成するために使用できるサンプルスクリプトは次のとおりです。

#!/bin/bash

shopt -s extglob
readonly URL="https://google.com"
links=($(grep -o -P '(?<=href=").*(?=")' source.html)) # read into array

for ((i=0; i<${#links[@]}; i++))
do
  case ${links[$i]} in
    http*)
      : # do nothing
      ;;
    /*)  
      links[$i]="$URL"${links[$i]}; # update array
      ;; 
    *)
      links[$i]="$URL/"${links[$i]}; # update array
      ;;
  esac
done

source.html現在ディレクトリにあるWebページのダウンロードソースと見なされます。

答え2

正規表現を使用してHTMLを解析する方法は数多くあります。エラー。これは、HTMLファイルからURLを抽出するのと同じように、一見単純なものにも当てはまります。

したがって、正規表現を使用しないでください。次のように使用してください。

#! /bin/bash

htmlfile='./file.html'
URL='https://google.com'

links=($(lynx -dump -listonly -nonumbers -force_html "$htmlfile" | 
         sed -e "s=^file://=$URL="))

printf "%s\n" "${links[@]}"

これが必要ですサルクインストールされています。 lynxncursesに基づくテキストモードのWebブラウザです。ここで使用されているのは、lynxすでに解決されているHTMLファイルのリンクリストを生成することです。思ったよりずっと難しいHTMLコンテンツ(ブラウザの操作の重要な部分)でURLを確実に見つける方法に関する問題です。 URLを抽出するためにHTMLを解析するのに良いライブラリモジュールがあるか、perl他の言語があります。pythonシェルスクリプトの場合lynx

man lynx詳細より。

lynxLinuxディストリビューションや他のUNIXのようなオペレーティングシステム用に事前にパッケージ化されて提供されることはほぼ確実です。そうでない場合は、上記のリンクからソースコードを取得できます。

関連情報