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


21

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

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

他のウェブサイトには.netありますが、.gov直前にカットオフポイントを作ることができると思い>ます。だから私は、grepを使用して、httpの前と.comの後にすべてをカットすることができることを知っていますが、私はしばらくの間それで立ち往生しています。


編集しました。一部のユーザーは、<とaの間のスペースを無視しますが、HTMLがないとHTMLは表示されません。キャッチしてくれてありがとう!
eltigre

コードの書式設定を使用します(テキストを選択してCtrl-Kを押します)。それ以外の場合は、<>強制的にHTMLタグとして表示されます。
ムル

hrefパラメータの開始と終了の引用符と一致しないのはなぜですか?それに、正規表現はhtmlに最適ではないと思います。
把友情留在無盐

具体的にはgrepとcutを使用してコマンドを作成します。他の方法もありますが、それらについて知りたいと思いました。
-eltigre

9
HTMLは正規言語ではないため、一般的にHTMLを正規表現で解析することはお勧めできません。構文解析しているHTMLがかなり単純であり、抽出しようとしているものが予測可能であることを保証できる場合、それを回避できる可能性があります。ただし、stackoverflow.com
a / 1732454/4014959

回答:


25

コメントで述べたように、通常、正規表現を使用してHTMLを解析することはお勧めできませんが、解析しているHTMLが適切に動作している場合は、それを回避できます。

要素のhref属性にあるURLのみを取得<a>するには、複数の段階で実行するのが最も簡単です。コメントから、完全なURLではなく、トップレベルドメインのみが必要なようです。その場合、次のようなものを使用できます。

grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' | 
grep -Eo '(http|https)://[^/"]+'

どこsource.html解析するHTMLコードを含むファイルです。

このコードは、各行の要素のhref属性として発生するすべてのトップレベルURLを出力します<a>-i最初のgrepコマンドのオプションは<a><A>要素と要素の両方で機能することを確認することです。大文字の属性OTOH をキャプチャ-iするために2番目grepに渡すこともできるHREFと思います。このような壊れた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ページにリダイレクトされるため、私の出力は他の例とは少し異なります。


ありがとうございました。今、これはまさに私が探していたものです。これが最もクリーンな方法です。
-eltigre

@eltigre:私の喜び!ただし、上記のコメントでリンクした警告に注意してください。:)
PM 2Ring

私は簡単な点を期待してこの質問に来ました...そして、あなたはすでに完全に頭に釘を打ちました
マークKコーワン

ありがとう、@ MarkKCowan。:) FWIW、私はもともとawkを使用して回答を書き始めましたが、awpに慣れていない人にとってはgrepベースのソリューションの方が理解しやすいと判断しました。とにかく、上記のコードは私のawkコードよりも短いです。
PM 2Ring

2
@mavavilj:OPはトップレベルドメインのみを必要としたため、その後://は最初の/またはの前の文字のみを受け入れ"ます。ただし、完全なURLを表示するには、そのコマンドをに変更しますgrep -Eo '(http|https)://[^"]+。その行のもう1つのオプションは、grep -Eo '(http|https)://[^?"]+'クエリオプションをカットすることです。ただし、そのバリエーションでは、クエリパラメーターとして別のURLに含まれるURLが引き続き印刷されますが、別の行に印刷されます。
PM 2Ring

25

ツールが制限されているかどうかわからない:

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

cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
  • grep -E:egrepと同じです
  • grep -o:grepさ​​れたもののみを出力します
  • (http | https):/または
  • az:すべて小文字です
  • AZ:すべて大文字です
  • 。:ドットです
  • \ ?:は?
  • *:[...]グループを繰り返します
  • uniq:重複を削除します

出力:

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
IRI正規表現!それらのいずれかを使用して、OPを怖がらせます!:)
ムル

2
@muru ... 震えている...何て言えばいいか分からない。それらは本当ですか!?
-jmunsch

4
@ jmunsch、uniqは隣接する重複を削除するだけです。sort -u
JJoao

1
それは素晴らしい、最高の答えです!!
Gery 16

@JJoaoは、パイピングよりも高速なsort -uのソースですか?ただの思考実験であり、idは見なければなりません。ただし、シェルミドルウェアについては、おそらく正しいでしょう。
-jmunsch

9

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


8

非正規表現の代替として、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が適切にフォーマットされていることに依存しないことです


1
+1のためpupの時間がそれをインストールするには、....
マーク・K・コーワン

それらをファイルに入れることもできます。pup 'a.classname[href] attr{href}' < tut.html >links.md
アフマドアワイス

1

ここで解決策を見つけましたで提案されたものよりもはるかに簡単で潜在的に高速なで。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や他のソースを確認する必要はありません。したがって、その後に行う必要があると思うのは、grepを使用して「lynx -dump」の結果を解析し、同じ結果のクリーンな未加工バージョンを取得することだけです。


しかし、問題は言う、「HTMLのから抽出URLのファイル [そのルックス]のように」(一例)、NOT「Webページから抽出URLを」。ローカルマシン上のファイルに対して回答を使用できる場合は、その方法を説明してください。コメントで返信しないでください。回答を編集して、より明確で完全なものにします。
G-Manが「Reinstate Monica」と言う

1
URLをファイル名に置き換えることができます。
asiby

@ G-Man、なぜ-1?自分でコードを試して、ローカルファイルでも機能することを確認する必要があります。明確ではない場合の説明を追加しました。
asiby

これは本当に便利です.. xargsで使用している場合は、追加する価値があります| 並べ替える| 重複リンクを削除するuniq。
スチュアート

0
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'

...またはそのようなもの-一部sedのs \nでは、最後の2つnのsのそれぞれにリテラルの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重複を削除できます。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.