it-swarm.com.de

So entfernen Sie alle Links einer HTML-Datei in Bash, Grep oder Batch und speichern Sie sie in einer Textdatei

Ich habe eine Datei mit dem Namen HTML und etwa 150 Ankertags. Ich brauche nur die Links von diesen Tags, AKA, <a href="*http://www.google.com*"></a>. Ich möchte nur den http://www.google.com part erhalten.

Wenn ich einen Grep laufen lasse,

cat website.htm | grep -E '<a href=".*">' > links.txt

dadurch wird die gesamte Zeile an mich zurückgegeben, die nicht auf dem gewünschten Link gefunden wurde. Daher habe ich versucht, den Befehl cut zu verwenden:

cat drawspace.txt | grep -E '<a href=".*">' | cut -d’”’ --output-delimiter=$'\n' > links.txt

Nur dass es falsch ist und nicht funktioniert, gibt mir einen Fehler bezüglich falscher Parameter ... Ich gehe also davon aus, dass die Datei auch weitergegeben werden sollte. Vielleicht wie cut -d’”’ --output-delimiter=$'\n' grepedText.txt > links.txt.

Aber ich wollte dies möglichst in einem Befehl tun ... Also versuchte ich, einen AWK - Befehl auszuführen.

cat drawspace.txt | grep '<a href=".*">' | awk '{print $2}’

Aber das würde auch nicht laufen. Ich bat mich um mehr Input, weil ich noch nicht fertig war ...

Ich habe versucht, eine Batchdatei zu schreiben, und es wurde mir mitgeteilt, dass FINDSTR kein interner oder externer Befehl ist ... Ich gehe also davon aus, dass meine Umgebungsvariablen durcheinander geraten waren und nicht, dass ich versucht habe, Grep unter Windows zu installieren ....

Die Frage ist, wie kann man die HTTP-Links aus HTML entfernen? Damit werde ich es für meine Situation schaffen.

P.S. Ich habe so viele Links/Stack Overflow-Posts gelesen, dass das Anzeigen meiner Referenzen zu lange dauern würde. Wenn HTML-Beispiel für die Komplexität des Prozesses benötigt wird, werde ich es hinzufügen.

Ich habe auch einen Mac und einen PC, die ich zwischen ihnen hin und her gewechselt habe, um ihre Shell-/batch-/grep-Befehls-/Terminalbefehle zu verwenden, also entweder oder werden mir helfen.

Ich möchte auch darauf hinweisen, dass ich im richtigen Verzeichnis bin

Enter image description here

HTML:

<tr valign="top">
    <td class="beginner">
      B03&nbsp;&nbsp;
    </td>
    <td>
        <a href="http://www.drawspace.com/lessons/b03/simple-symmetry">Simple Symmetry</a>  </td>
</tr>

<tr valign="top">
  <td class="beginner">
    B04&nbsp;&nbsp;
  </td>
  <td>
      <a href="http://www.drawspace.com/lessons/b04/faces-and-a-vase">Faces and a Vase</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
      B05&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b05/blind-contour-drawing">Blind Contour Drawing</a> </td>
</tr>

<tr valign="top">
    <td class="beginner">
        B06&nbsp;&nbsp;
    </td>
    <td>
      <a href="http://www.drawspace.com/lessons/b06/seeing-values">Seeing Values</a> </td>
</tr>

Erwartete Ausgabe:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
etc.
10
A'sa Dickens
$ sed -n 's/.*href="\([^"]*\).*/\1/p' file
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
21
Ed Morton

Sie können grep dafür verwenden:

grep -Po '(?<=href=")[^"]*' file

Es druckt alles nach href=", bis ein neues Anführungszeichen angezeigt wird.

Mit Ihrer Eingabe wird zurückgegeben:

http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values

Beachten Sie, dass es nicht erforderlich ist, cat drawspace.txt | grep '<a href=".*">' zu schreiben. Sie können nutzlose Verwendung von cat mit grep '<a href=".*">' drawspace.txt entfernen.

Ein anderes Beispiel

$ cat a
hello <a href="httafasdf">asdas</a>
hello <a href="hello">asdas</a>
other things

$ grep -Po '(?<=href=")[^"]*' a
httafasdf
hello
18
fedorqui

Meine Vermutung ist, dass auf Ihrem PC oder Mac der Befehl lynx nicht standardmäßig installiert ist (er steht kostenlos im Internet zur Verfügung), aber mit lynx können Sie Folgendes tun:

$ lynx -dump -image_links -listonly /usr/share/xdiagnose/workloads/youtube-reload.html

Ausgabe: Referenzen

  1. datei: //localhost/usr/share/xdiagnose/workloads/youtube-reload.html
  2. http://www.youtube.com/v/zeNXuC3N5TQ&hl=de&fs=1&autoplay=1

Es ist dann eine einfache Sache, für die http: -Zeile zu greifen. Und es gibt sogar Luchsoptionen, um nur die http: -Zeilen zu drucken (Luchs hat viele, viele Optionen).

4
Michael

Gemäß dem Kommentar von triplee wird die Verwendung von regex zum Analysieren von HTML- oder XML-Dateien im Wesentlichen nicht durchgeführt. Werkzeuge wie sed und awk sind äußerst leistungsfähig im Umgang mit Textdateien, aber wenn es darauf ankommt, komplex strukturierte Daten wie XML, HTML, JSON usw. zu analysieren, sind sie nichts weiter als ein Vorschlaghammer. Ja, Sie können die Arbeit erledigen, aber manchmal mit enormen Kosten. Um mit solchen empfindlichen Dateien umgehen zu können, benötigen Sie ein wenig mehr Finesse, indem Sie mehr zielgerichtete Tools verwenden.

Wenn Sie XML oder HTML analysieren, können Sie einfach xmlstarlet verwenden.

Im Falle einer XHTML-Datei können Sie Folgendes verwenden:

xmlstarlet sel --html  -N "x=http://www.w3.org/1999/xhtml" \
               -t -m '//x:a/@href' -v . -n

wenn -N den XHTML-Namespace angibt, wird dieser von erkannt 

<html xmlns="http://www.w3.org/1999/xhtml">

Da HTML-Seiten jedoch häufig kein wohlgeformtes XML sind, kann es nützlich sein, sie mit tidy etwas aufzuräumen. Im obigen Beispielfall ergibt sich dann:

$ tidy -q -numeric -asxhtml --show-warnings no <file.html> \
  | xmlstarlet sel --html -N "x=http://www.w3.org/1999/xhtml" \
                   -t -m '//x:a/@href' -v . -n
http://www.drawspace.com/lessons/b03/simple-symmetry
http://www.drawspace.com/lessons/b04/faces-and-a-vase
http://www.drawspace.com/lessons/b05/blind-contour-drawing
http://www.drawspace.com/lessons/b06/seeing-values
1
kvantour

Verwenden Sie grep, um alle Zeilen mit Links zu extrahieren, und verwenden Sie dann sed, um die URLs abzurufen:

grep -o '<a href=".*">' *.html | sed 's/\(<a href="\|\">\)//g' > link.txt;
0
Sathish