HTMLファイルからURLを抽出するためにgrepとcutを使用しようとしています。リンクは次のようになります。
<a href="http://examplewebsite.com/">
他のウェブサイトには.net
、.gov
がありますが、>
の直前にカットオフポイントを設定できると思います。したがって、httpの前と.comの後ですべてgrepとcutを使用してすべてを切り捨てることができることはわかっていますが、しばらくの間、それを続けています。
コメントで述べたように、正規表現を使用してHTMLを解析することは一般に良い考えではありませんが、解析しているHTMLが適切に動作している場合は、それを回避できることがあります。
<a>
要素のhref
属性にあるURLのみを取得するために、複数の段階で取得するのが最も簡単です。コメントから、完全なURLではなくトップレベルドメインのみが必要なようです。その場合、次のようなものを使用できます。
grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
ここで、source.html
は、解析するHTMLコードを含むファイルです。
このコードは、各行の<a>
要素のhref
属性として出現するすべてのトップレベルURLを出力します。最初のgrep
コマンドの-i
オプションは、<a>
エレメントと<A>
エレメントの両方で確実に機能するようにするためのものです。大文字のgrep
属性、OTOHをキャプチャするために、2番目のHREF
に-i
を与えることもできると思います。このような壊れたHTMLは無視したいと思います。 :)
http://google.com/
のコンテンツを処理するには
wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
出力
http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au
オーストラリアのGoogleページにリダイレクトされるため、私の出力は他の例とは少し異なります。
ツールに制限があるかどうかわからない:
しかし、前述のように正規表現は最善の方法ではないかもしれませんが、ここに私がまとめた例があります:
cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
出力:
bob@bob-NE722:~s$ wget -qO- https://stackoverflow.com/ | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
https://stackauth.com
https://meta.stackoverflow.com
https://cdn.sstatic.net/Img/svg-icons
https://stackoverflow.com
https://www.stackoverflowbusiness.com/talent
https://www.stackoverflowbusiness.com/advertising
https://stackoverflow.com/users/login?ssrc=head
https://stackoverflow.com/users/signup?ssrc=head
https://stackoverflow.com
https://stackoverflow.com/help
https://chat.stackoverflow.com
https://meta.stackoverflow.com
...
\d
他の数値型をキャッチします。
GrepがPerl正規表現をサポートしている場合:
grep -Po '(?<=href=")[^"]*(?=")'
(?<=href=")
および(?=")
are lookaroundhref
属性の式。これには-P
オプション。-o
は、一致するテキストを出力します。例えば:
$ curl -sL https://www.google.com | grep -Po '(?<=href=")[^"]*(?=")'
/search?
https://www.google.co.in/imghp?hl=en&tab=wi
https://maps.google.co.in/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?gl=IN&tab=w1
https://news.google.co.in/nwshp?hl=en&tab=wn
...
いつものように、これらが有効なURIであること、または解析しているHTMLが有効であることは保証されません。
pup 'a[href] attr{href}' < yourfile.html
a
属性を持つすべてのhref
要素を検索し、href
属性の値を表示します。
pup
をインストールするには、Go(プログラミング言語)が必要です。
Sudo apt-get install golang
Sudo go get github.com/ericchiang/pup
このソリューションの利点は、 適切にフォーマットされたHTMLに依存しない であることです。
ここで解決策を見つけました これは、ここで提案したものよりもIMHOがはるかに単純で、潜在的に高速です。 httpsファイルをサポートするように少し調整しました。しかし、TD; TRバージョンは...
PS:サイトのURLをファイルへのパスに置き換えることができ、同じように機能します。
lynx -dump -listonly -nonumbers "http://www.goggle.com" > links.txt
lynx -dump -listonly -nonumbers "some-file.html" > links.txt
ファイルに配置するのではなく、単にリンクを表示したい場合は、代わりにこれを試してください...
lynx -dump -listonly -nonumbers "http://www.google.com"
lynx -dump -listonly -nonumbers "some-file.html"
結果は次のようになります...
http://www.google.ca/imghp?hl=en&tab=wi
http://maps.google.ca/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
http://www.youtube.com/?gl=CA&tab=w1
http://news.google.ca/nwshp?hl=en&tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
https://www.google.ca/intl/en/options/
http://www.google.ca/history/optout?hl=en
...
etc.
私のユースケースでは、これはうまくいきました。しかし、最近では、ライブラリのCDN URIにsrc = "// blah.tld"のようなリンクが追加されていることに注意してください。取得したリンクでそれらを見たくありませんでした。
「lynx -dump」はデフォルトで、指定されたページからすべてのクリック可能なリンクを抽出するため、リンクのhrefまたは他のソースを確認する必要はありません。したがって、その後に行う必要があるのは、glynを使用して「lynx -dump」の結果を解析し、同じ結果のよりクリーンな未加工バージョンを取得することだけです。
wget -qO- google.com |
tr \" \\n | grep https\*://
...おそらくかなりうまくいくでしょう。書かれているように、それは印刷します:
http://schema.org/WebPage
http://www.google.com/imghp?hl=en&tab=wi
http://maps.google.com/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
http://www.youtube.com/?tab=w1
http://news.google.com/nwshp?hl=en&tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
http://www.google.com/intl/en/options/
http://www.google.com/history/optout?hl=en
https://accounts.google.com/ServiceLogin?hl=en&continue=http://www.google.com/
https://www.google.com/culturalinstitute/project/the-holocaust?utm_source=google&utm_medium=hppromo&utm_campaign=auschwitz_q1&utm_content=desktop
https://plus.google.com/116899029375914044550
リンクのみを照合し、それらのトップレベルドメインの中から照合することが重要な場合は、次のようにできます。
wget -qO- google.com |
sed '/\n/P;//!s|<a[^>]*\(https*://[^/"]*\)|\n\1\n|;D'
...またはそのようなもの-一部のsed
sでは、最後の2つのn
sのそれぞれをリテラル\n
ewline文字に置き換える必要がある場合があります。
上記のコマンドを実行すると、次のように出力されます。
http://www.google.com
http://maps.google.com
https://play.google.com
http://www.youtube.com
http://news.google.com
https://mail.google.com
https://drive.google.com
http://www.google.com
http://www.google.com
http://www.google.com
https://www.google.com
https://plus.google.com
...そしてどちらの場合でも(ただし、おそらく後者の場合に最も便利です)|sort -u
フィルターを最後まで追加して、リストsort
edを取得して削除できます重複。
最短
grep -r http . --color