Ich versuche, grep and cut zu verwenden, um URLs aus einer HTML-Datei zu extrahieren. Die Links sehen so aus:
<a href="http://examplewebsite.com/">
Andere Websites haben .net
, .gov
aber ich gehe davon aus, dass ich den Cut-Off-Punkt direkt vorher machen könnte >
. Also weiß ich, dass ich grep und cut irgendwie verwenden kann, um alles vor http und nach .com abzuschneiden, aber ich bin schon eine Weile dabei geblieben.
shell-script
grep
string
cut
eltigre
quelle
quelle
<>
erzwingt das, dass es als HTML-Tag betrachtet wird.Antworten:
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 in den
href
Attributen von<a>
Elementen enthalten sind, ist es für mich am einfachsten, sie in mehreren Schritten auszuführen. Aus Ihren Kommentaren geht hervor, dass Sie nur die Top-Level-Domain und nicht die vollständige URL wünschen. In diesem Fall können Sie Folgendes verwenden:Wo
source.html
ist die Datei, die den zu analysierenden HTML-Code enthält?Dieser Code gibt alle URLs der obersten Ebene aus, die als
href
Attribut aller<a>
Elemente in jeder Zeile auftreten. Die-i
Option für den erstengrep
Befehl besteht darin, sicherzustellen, dass er sowohl für Elemente<a>
als auch für<A>
Elemente funktioniert . Ich vermute, Sie könnten auch-i
die 2. eingeben,grep
umHREF
Attribute in Großbuchstaben zu erfassen , OTOH. :)Zum Verarbeiten des Inhalts von
http://google.com/
Ausgabe
Meine Ausgabe unterscheidet sich ein wenig von den anderen Beispielen, da ich auf die australische Google-Seite weitergeleitet werde.
quelle
://
akzeptieren wir nach dem nur noch Zeichen vor dem ersten/
oder"
. Wenn Sie jedoch die vollständige URL anzeigen möchten, ändern Sie diesen Befehl ingrep -Eo '(http|https)://[^"]+
. Eine weitere Option für diese Zeile istgrep -Eo '(http|https)://[^?"]+'
das Ausschneiden von Abfrageoptionen. Diese Variante gibt jedoch weiterhin URLs aus, die in einer anderen URL als Abfrageparameter enthalten sind, sie werden jedoch in einer separaten Zeile gedruckt.Nicht sicher, ob Sie auf Werkzeuge beschränkt sind:
Aber Regex ist vielleicht nicht der beste Weg, wie erwähnt, aber hier ist ein Beispiel, das ich zusammengestellt habe:
Ausgabe:
Sie können auch hinzufügen
\d
, um andere Zifferntypen abzufangen.quelle
sort -u
?Wenn Ihr grep Perl-Regexes unterstützt:
(?<=href=")
und(?=")
sind Lookaround- Ausdrücke für dashref
Attribut. Dies erfordert die-P
Option.-o
druckt den passenden Text.Beispielsweise:
Wie üblich kann nicht garantiert werden, dass es sich um gültige URIs handelt oder dass der von Ihnen analysierte HTML-Code gültig ist.
quelle
Verwenden Sie als nicht reguläre Alternative pup :
Findet alle
a
Elemente, die einhref
Attribut haben, und zeigt dann den Wert deshref
Attributs an.Zur Installation
pup
benötigen Sie Go (eine Programmiersprache):Der Vorteil dieser Lösung besteht darin, dass das HTML nicht ordnungsgemäß formatiert werden muss .
quelle
pup
, Zeit, um das zu installieren ....pup 'a.classname[href] attr{href}' < tut.html >links.md
Ich habe hier eine Lösung gefunden , die meiner Meinung nach viel einfacher und potenziell schneller ist 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 das funktioniert genauso.
Wenn Sie nur die Links sehen möchten, anstatt sie in einer Datei zu platzieren, versuchen Sie dies stattdessen ...
Das Ergebnis sieht ungefähr so aus ...
Für meinen Anwendungsfall hat dies einwandfrei funktioniert. Hüten Sie sich jedoch vor der Tatsache, dass heutzutage Links wie src = "// blah.tld" für die CDN-URI von Bibliotheken hinzugefügt werden. Ich wollte die in den abgerufenen Links nicht 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.
quelle
... würde sich wohl ganz gut machen. Wie geschrieben wird gedruckt:
Wenn es wichtig ist, dass Sie nur Links und Domains der obersten Ebene zuordnen, können Sie Folgendes tun:
... oder so ähnlich - für einige
sed
s müssen Sie jedoch möglicherweise\n
jedes der letzten beidenn
s durch ein wörtliches ewline-Zeichen ersetzen .Der obige Befehl gibt wie geschrieben aus:
... und in beiden Fällen (aber wahrscheinlich am nützlichsten bei letzteren) können Sie einen
|sort -u
Filter bis zum Ende anheften , um die Liste zusort
bearbeiten und Duplikate zu löschen.quelle
Kürzeste
quelle
quelle