it-swarm.com.de

Verwendung von grep und cut in script zum Abrufen von Website-URLs aus einer HTML-Datei

Ich versuche, grep und cut zu verwenden, um URLs aus einer HTML-Datei zu extrahieren. Die Links sehen aus wie:

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

Andere Websites haben .net, .gov, Aber ich gehe davon aus, dass ich den Grenzwert kurz vor > Machen könnte. Ich weiß also, dass ich grep und cut irgendwie verwenden kann, um alles vor http und nach .com abzuschneiden, aber ich habe eine Weile daran festgehalten.

23
eltigre

Wie ich in meinem Kommentar sagte, ist es im Allgemeinen keine gute Idee, HTML mit regulären Ausdrücken zu analysieren, aber Sie können manchmal damit durchkommen, wenn sich das HTML, das Sie analysieren, gut verhält.

Um nur URLs zu erhalten, die sich im Attribut href von <a> - Elementen befinden, finde ich es am einfachsten, dies in mehreren Schritten zu tun. Aus Ihren Kommentaren geht hervor, dass Sie nur die Domain der obersten Ebene und nicht die vollständige URL möchten. In diesem Fall können Sie Folgendes verwenden:

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

dabei ist source.html die Datei, die den zu analysierenden HTML-Code enthält.

Dieser Code druckt alle URLs der obersten Ebene, die als href -Attribut aller <a> - Elemente in jeder Zeile auftreten. Die Option -i Für den ersten Befehl grep soll sicherstellen, dass er sowohl für <a> Als auch für <A> Elemente funktioniert. Ich denke, Sie könnten auch -i Dem 2. grep geben, um Großbuchstaben HREF Attribute zu erfassen, OTOH, ich würde es vorziehen, solch kaputtes HTML zu ignorieren. :) :)

So verarbeiten Sie den Inhalt von http://google.com/

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

Ausgabe

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

Meine Ausgabe unterscheidet sich ein wenig von den anderen Beispielen, da ich zur australischen Google-Seite weitergeleitet werde.

26
PM 2Ring

Sie sind sich nicht sicher, ob Sie nur über wenige Tools verfügen:

Aber Regex ist vielleicht nicht der beste Weg, wie erwähnt, aber hier ist ein Beispiel, das ich zusammengestellt habe:

cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
  • grep -E: ist dasselbe wie egrep
  • grep -o: Gibt nur das aus, was gepackt wurde
  • (http | https): ist ein entweder/oder
  • a-z: ist alles in Kleinbuchstaben
  • A-Z: ist alles uper Fall
  • . : ist Punkt
  • /: ist der Schrägstrich
  • ? : ist?
  • *: Wiederholen Sie die [...] Gruppe
  • sort -u: sortiert und entfernt alle Duplikate

Ausgabe:

[email protected]:~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
...

Sie können auch \d, um andere Zifferntypen zu fangen.

27
jmunsch

Wenn Ihr grep Perl-Regexe unterstützt:

grep -Po '(?<=href=")[^"]*(?=")'
  • (?<=href=") und (?=") are Lookaround Ausdrücke für das Attribut href. Dies benötigt das -P Möglichkeit.
  • -o druckt den passenden Text.

Zum Beispiel:

$ 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
...

Wie üblich gibt es keine Garantie dafür, dass dies gültige URIs sind oder dass der von Ihnen analysierte HTML-Code gültig ist.

11
muru

Verwenden Sie als Nicht-Regex-AlternativeWelpe :

pup 'a[href] attr{href}' < yourfile.html

Findet alle a Elemente, die ein href Attribut haben, und zeigt dann den Wert des href Attributs an.

Um pup zu installieren, benötigen Sie Go (eine Programmiersprache):

Sudo apt-get install golang
Sudo go get github.com/ericchiang/pup

Der Vorteil dieser Lösung ist, dass sie nicht davon abhängt, dass der HTML-Code richtig formatiert ist .

8
Kroltan

Ich habe hier eine Lösung gefunden das ist meiner Meinung nach viel einfacher und möglicherweise schneller als das, was hier vorgeschlagen wurde. Ich habe ein wenig angepasst, um https-Dateien zu unterstützen. Aber die TD; TR-Version ist ...

PS: Sie können die Site-URL durch einen Pfad zu einer Datei ersetzen, und dies funktioniert genauso.

lynx -dump -listonly -nonumbers "http://www.goggle.com" > links.txt

lynx -dump -listonly -nonumbers "some-file.html" > links.txt

Wenn Sie nur die Links sehen möchten, anstatt sie in einer Datei zu platzieren, versuchen Sie dies stattdessen ...

lynx -dump -listonly -nonumbers "http://www.google.com"

lynx -dump -listonly -nonumbers "some-file.html"

Das Ergebnis sieht wie folgt aus ...

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.

Für meinen Anwendungsfall hat dies gut funktioniert. Beachten Sie jedoch, dass heutzutage Links wie src = "// blah.tld" für die CDN-URI von Bibliotheken hinzugefügt werden. Ich wollte diese nicht in den abgerufenen Links sehen.

Sie müssen nicht versuchen, nach href oder anderen Quellen für Links zu suchen, da "lynx -dump" standardmäßig alle anklickbaren Links von einer bestimmten Seite extrahiert. Der einzige Gedanke, den Sie danach tun müssen, ist, das Ergebnis von "lynx -dump" mit grep zu analysieren, um eine sauberere Rohversion desselben Ergebnisses zu erhalten.

1
asiby
wget -qO- google.com |
tr \" \\n | grep https\*://

... würde wahrscheinlich ziemlich gut machen. Wie geschrieben, druckt es:

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

Wenn es wichtig ist, dass Sie nur Links und aus diesen Top-Level-Domains abgleichen, können Sie Folgendes tun:

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

... oder so ähnlich - obwohl Sie für einige seds möglicherweise ein wörtliches \n ewline-Zeichen für jedes der letzten beiden ns ersetzen müssen.

Wie oben geschrieben, wird der obige Befehl gedruckt:

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

... und für jeden Fall (aber wahrscheinlich am nützlichsten mit letzterem) Sie können einen |sort -u - Filter bis zum Ende anheften, um die Liste sorted und to zu erhalten Duplikate löschen.

1
mikeserv

Kürzeste

grep -r http . --color
0
strash