HTMLファイルからURLを抽出するためにgrepとcutを使用しようとしています。リンクは次のとおりです。
<a href="http://examplewebsite.com/">
他のサイトにもありますが、あらかじめ.net
カット.gov
オフポイントを設定できると思いました>
。だから私はgrepとcutを使ってhttp以前と.com以降のすべてを何とかブロックできることを知っていますが、しばらくこの問題に閉じ込められていました。
答え1
ツールが制限されているかどうかはわかりません。
しかし、上記のように、正規表現は最善の方法ではないかもしれませんが、以下は私がまとめた例です。
cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | sort -u
grep -E
: egrep と同じgrep -o
:grepされた内容のみ出力(http|https)
:は/またはa-z
: すべて小文字A-Z
: すべて大文字.
: はい/
:スラッシュです?
:はい?=
:等号です_
:下線です%
:パーセント記号です:
:はコロンです-
:ダッシュです*
: 繰り返し [...] グループ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
追加して他の数値タイプをキャプチャすることもできます。
答え2
コメントで述べたように、HTMLを解析するために正規表現を使用するのは一般的に良い考えではありませんが、解析中のHTMLが正しく機能する場合は、それを使用する必要はありません。
href
要素のプロパティからURLのみを取得するには、いくつかの手順を<a>
実行するのが最も簡単な方法であることがわかりました。あなたのコメントによれば、完全なURLではなくトップレベルのドメイン名だけが欲しいようです。この場合、次のように使用できます。
grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
source.html
解析するHTMLコードを含むファイル。
href
このコードは、各行のすべての要素の属性として表示されるすべての最上位URLを印刷します。最初のコマンドのオプションは、<a>
そのコマンドが要素に適用されることを確認することです。大文字のプロパティであるOTOHをキャプチャするために2番目のプロパティを提供することもできます。私はこの破損したHTMLを無視することをお勧めします。 :)-i
grep
<a>
<A>
-i
grep
HREF
コンテンツ処理中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 ページにリダイレクトされると、出力は他の例と若干異なります。
答え3
grepがPerl正規表現をサポートしている場合:
grep -Po '(?<=href=")[^"]*(?=")'
(?<=href=")
そして(?=")
周りを見てください属性の表現ですhref
。これには-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が有効であることを保証することはできません。
答え4
ここで解決策を見つけました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や他のリンクソースをチェックする必要はありません。したがって、後で行うべき唯一のことは、「lynx -dump」の結果をgrepに解析して、同じ結果のよりクリーンな生バージョンを得ることです。