web-dev-qa-db-ja.com

grepを使用してスクリプトで切り取り、HTMLファイルからWebサイトのURLを取得する方法

HTMLファイルからURLを抽出するためにgrepとcutを使用しようとしています。リンクは次のようになります。

<a href="http://examplewebsite.com/">

他のウェブサイトには.net.govがありますが、>の直前にカットオフポイントを設定できると思います。したがって、httpの前と.comの後ですべてgrepとcutを使用してすべてを切り捨てることができることはわかっていますが、しばらくの間、それを続けています。

23
eltigre

コメントで述べたように、正規表現を使用して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ページにリダイレクトされるため、私の出力は他の例とは少し異なります。

26
PM 2Ring

ツールに制限があるかどうかわからない:

しかし、前述のように正規表現は最善の方法ではないかもしれませんが、ここに私がまとめた例があります:

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他の数値型をキャッチします。

27
jmunsch

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が有効であることは保証されません。

11
muru

非正規表現の代替 として、 pup を使用します:

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に依存しない であることです。

8
Kroltan

ここで解決策を見つけました これは、ここで提案したものよりも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」の結果を解析し、同じ結果のよりクリーンな未加工バージョンを取得することだけです。

1
asiby
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&amp;utm_medium=hppromo&amp;utm_campaign=auschwitz_q1&amp;utm_content=desktop
https://plus.google.com/116899029375914044550

リンクのみを照合し、それらのトップレベルドメインの中から照合することが重要な場合は、次のようにできます。

wget -qO- google.com |
sed '/\n/P;//!s|<a[^>]*\(https*://[^/"]*\)|\n\1\n|;D'

...またはそのようなもの-一部のsedsでは、最後の2つのnsのそれぞれをリテラル\newline文字に置き換える必要がある場合があります。

上記のコマンドを実行すると、次のように出力されます。

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フィルターを最後まで追加して、リストsortedを取得して削除できます重複。

1
mikeserv

最短

grep -r http . --color
0
strash