Parsen von HTML mit Hilfe von shell
Ich habe eine HTML mit vielen Daten und Teil ich bin interessiert an:
<tr valign=top>
<td><b>Total</b></td>
<td align=right><b>54</b></td>
<td align=right><b>1</b></td>
<td align=right>0 (0/0)</td>
<td align=right><b>0</b></td>
</tr>
Ich versuche es mal mit awk
was jetzt ist:
awk -F "</*b>|</td>" '/<[b]>.*[0-9]/{print $1, $2, $3 }' "index.html"
aber was ich will ist zu haben:
54
1
0
0
Recht jetzt bin ich immer:
'<td align=right> 54'
'<td align=right> 1'
'<td align=right> 0'
Irgendwelche Vorschläge?
- Ist er der 2.-Letzte null ausgegeben, weil es keine
<b>
tag oder weil es eine<td>
Wert von0 (0/0)
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ausgabe:
Anderen:
getline
. In diesem Fall gibt es einfach keine Notwendigkeit für diegetline
Schleife an alle, eine einfache Flagge tun würdef{ subs(..); print; if (!/<td /) exit} /..Total/{f=1}
if (!/<td /) exit
früher. Flagging ist ein guter Ansatz auch tatsächlich, aber es ist leichter zu kommen mit etwas, das nicht manchmal. Kennzeichnen ist fertig, wenn Sie bereits versuchen, Ihren code mehr glatt oder effizient. Noch einmal übergetline
,getline > 0
ist völlig sicher, und sicher genug, Lesen Sie sich die Gebrauchsanweisung sorgfältig durch. Es ist ziemlich klar, wie die verschiedenen Schreibweisen unterscheiden sich in Funktion. Das einzige was wirklich zu beachten ist Den getline Befehl gibt 1 bei Erfolg, 0 bei Dateiende und -1 auf einen Fehler.!/<td /
wäre erst gekommen. Betrachten Sie beide Ansätze-und jetzt fügen Sie eine Anforderung, die Sie drucken müssen jeder Zeile von Zeile 1 bis/<td /
Zeile in eine Datei namens "foo" für die Fehlersuche. Beachten Sie, dass wenn Sie diegetline
Ansatz, den Sie brauchen, um Ihreprint > "foo"
an 2 stellen in der Erwägung, dass mit dem normalen Ansatz, nur dass die awk-Schleife tun, was Sie tut, Sie müssen nur dieprint > "foo"
an einem Ort. Vermeidung von getline, wenn es nicht notwendig ist nicht nur über das schreiben von sicherem code, sondern auch um schreiben von code, können erhalten und ausgebaut werden leicht.getline
1 zurückgibt, und nicht nur ungleich null.×Kommentare können nur bearbeitet werden, für 5 Minuten×Kommentare können nur bearbeitet werden, für 5 Minuten×Kommentare können nur bearbeitet werden, für 5 Minuteninclude
Richtlinien. Ich sage nur, stellen Sie sicher, Sie sind sich bewusst, all die Vorsichtsmaßnahmen, wenn Sie eine Entscheidung zu verwenden oder nicht, und verwenden Sie es nicht, wenn es nur so einfach oder einfacher zu bedienen awks normalen implizite Datei-Lesen-Schleife, weil neben all der Vorbehalte, die es in der Regel macht das nächste, was Sie tun möchten, erschweren.awk
ist kein HTML-parser. Verwendenxpath
oder sogarxslt
für, die.xmllint
ist ein commandline-tool, welches in der Lage ist zum ausführen von XPath-Abfragen und -xsltproc
kann verwendet werden, um die XSL-Transformationen. Beide tools gehören zum Paketlibxml2-utils
.Außerdem können Sie mit einer Programmiersprache, die in der Lage ist, zu analysieren, HTML
awk
da es ist Turing-vollständig. Auch Sie müssen verstehen, dass das extrahieren von Informationen aus einer text-Datei, und voll Verständnis und der Darstellung eines document sind zwei verschiedene Dinge. Aber hey, würde ich immer noch verwenden Sie eine ready-to-use-parser anstelle des Schreibens einer benutzerdefinierten man wieder und wieder mitawk
..Sollten Sie wirklich nutzen, um einige echte HTML parser für diesen job, wie:
Drucke:
Aber für diese müssen Sie perl installiert und Mojolicious-Paket.
(es ist einfach zu installieren mit:)
HTML-XML-utils
Können Sie verwenden
htmlutils
für die Analyse gut formatierte HTML-/XML-Dateien. Das Paket umfasst eine Vielzahl von binary-tools zu extrahieren oder die Daten ändern. Zum Beispiel:Hier ist das Beispiel mit den bereitgestellten Daten:
Hier das Letzte Beispiel mit Strippen aus
<b>
tags:Weitere Beispiele, check die html-xml-utils.
BSD/GNU
grep
/ripgrep
Für einfaches extrahieren, die Sie verwenden können
grep
zum Beispiel:Dein Beispiel mit
grep
:und mit
ripgrep
:Extrahieren äußeren html-Code H1:
Andere Beispiele:
Extrahieren den Körper:
Statt
xargs
Sie können auchtr '\n' ' '
.Für mehrere tags, siehe: Text zwischen zwei tags.
Wenn Sie den Umgang mit großen Datenmengen, sollten Sie die Verwendung
ripgrep
, die hat eine ähnliche syntax, aber es ist ein schneller Weg, da es geschrieben in Rost.ex
/vim
Weitere erweiterte parsing -, können Sie in-place-Editoren wie ex/vi, wo können Sie wechseln Sie zwischen den entsprechenden HTML-tags, Auswahl/löschen innere/äußere-tags, und Bearbeiten Sie den Inhalt in-place.
Hier ist der Befehl:
Dies ist, wie der Befehl funktioniert:
Verwenden
ex
in-place-editor zu ersetzen, auf allen Linien (%
) von:ex +"%s/pattern/replace/g"
.Die substitution pattern besteht aus 3 teilen:
>
(^[^>].*>
) für die Entfernung, direkt vor der 2. Teil.<
(([^<]+)
).<
für die Entfernung (<.*
).\1
bezieht sich auf das Muster innerhalb der Spitzen Klammern (()
).Nach der substitution, entfernen wir alle alphanumerischen Zeilen mithilfe global:
g/[a-zA-Z]/d
.+%p
.-s
) beenden ohne speichern (-c "q!"
), oder speichern Sie in die Datei (-c "wq"
).Wenn getestet, um die Datei ersetzen in-place ändern
-scq!
zu-scwq
.Hier ist ein weiteres einfaches Beispiel, das entfernt die style-Tags aus dem header und druckt den analysierten Ausgabe:
Jedoch, es ist nicht empfohlen zu verwenden regex zum Parsen von html-daher für den langfristigen Ansatz, den Sie verwenden sollten, die entsprechende Sprache (wie Python, perl oder PHP DOM).
Siehe auch: