Ich möchte abrufen, was sich zwischen diesen beiden Tags befindet - <tr> </tr>
- aus einem HTML-Dokument. Jetzt habe ich keine spezifischen HTML-Anforderungen, die für einen HTML-Parser gerechtfertigt wären. Ich brauche einfach etwas, das passt <tr>
und </tr>
und alles dazwischen bekommt und es könnte mehrere tr
s geben. Ich habe awk ausprobiert, was funktioniert, aber aus irgendeinem Grund gibt es mir Duplikate jeder extrahierten Zeile.
awk '
/<TR/{p=1; s=$0}
p && /<\/TR>/{print $0 FS s; s=""; p=0}
p' htmlfile> newfile
Wie geht man vor?
shell-script
text-processing
sed
awk
html
TechJack
quelle
quelle
'/<tr/{p=1}; p; /<\/tr>/{p=0}'
. Posten Sie einige Beispieleingaben und erwartete Ausgaben, wenn dies nicht funktioniert.awk
arbeiten, aber geben Sie Duplikate, versuchen Sie, die Ausgabe Ihrer awk vonsort -u
zu übergeben, um sie zu unterscheidenAntworten:
Wenn du nur
...
alles machen<tr>...</tr>
willst:grep -o '<tr>.*</tr>' HTMLFILE | sed 's/\(<tr>\|<\/tr>\)//g' > NEWFILE
Für mehrzeilige tun:
tr "\n" "|" < HTMLFILE | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g;s/|/\n/g' > NEWFILE
Überprüfen Sie zuerst die HTML-Datei des Zeichens "|" (nicht üblich, aber möglich) und wenn es existiert, wechseln Sie zu einem, der nicht existiert.
quelle
echo "bla<tr>foo</tr>bla<tr>bar</tr>bla" | grep -o '<tr>.*</tr>' | sed 's/\(<tr>\|<\/tr>\)//g'
gibtfooblabar
. Derbla
sollte nicht da sein?grep -Po '<tr>.*?</tr>'
würde ein Ergebnis pro Zeile in @ NNs Fall zurückgeben, aber es ist nicht portierbar.Sie haben eine Anforderung, die einen HTML-Parser gewährleistet: Sie müssen HTML analysieren. Perls HTML :: TreeBuilder , Pythons BeautifulSoup und andere sind einfach zu verwenden und einfacher als das Schreiben komplexer und spröder regulärer Ausdrücke.
oder
quelle
sed
undawk
sind nicht gut für diese Aufgabe geeignet, sollten Sie lieber einen richtigen HTML-Parser verwenden. Zum Beispielhxselect
von w3.org:quelle
hxselect
macht es ziemlich gute Arbeit mit wohlgeformten HTML / XML-Dokumenten. Außerdem ist es schneller zu bedienen als Perl, Python und andere. Ich denke, eshxselect
ist ein guter Mittelweg zwischensed
/awk
und Parser-Bibliotheken.hxselect
sieht gut aus, wird es auf jeden Fall mehr erforschen. Vielen Dank.hxnormalize
kümmert sich um nicht wohlgeformte HTML / XML-Dateien.Wenn
ruby
verfügbar, können Sie Folgendes tunWo
file
ist Ihre Eingabe-HTML-Datei. Der Befehl führt einen Ruby-Einzeiler aus. Zuerst liest es alle Zeilen ausfile
und fügt sie zu einem String zusammenreadlines.join
. Dann wählt es aus der Zeichenfolge etwas zwischen (aber nicht einschließlich)<tr>
und<\/tr>
das ist ein Zeichen oder länger, unabhängig von Zeilenumbrüchen[/(?<=<tr>).+(?=<\/tr>)/m]
. Anschließend werden alle<tr>
oder</tr>
aus der Zeichenfolge entferntgsub(/<\/?tr>/, "")
(dies ist erforderlich, um verschachteltetr
Tags zu verarbeiten). Schließlich wird die Zeichenfolge gedrucktputs
.Sie sagten, dass ein HTML-Parser für Sie nicht garantiert ist, aber es ist sehr einfach, mit Nokogiri zu arbeiten,
ruby
und es macht den Befehl einfacher.-rnokogiri
lädt Nokogiri.Nokogiri::HTML(readlines.join)
liest alle Zeilen vonfile
.xpath("//tr")
wählt jedestr
Element aus undmap { |e| e.content }
wählt den Inhalt für jedes Element aus, dh was zwischen<tr>
und ist</tr>
.quelle
grep
Um Inhalte innerhalb eines
tr
Tags über mehrere Zeilen hinweg abzurufen , müssen Sie diesexargs
zuerst durchlaufen. Beispiel:Um nur inneres HTML zurückzugeben, verwenden Sie:
Überprüfen Sie die Syntax für
perlre
erweiterte Muster .Hinweis: Um eine schnellere Leistung zu erzielen, sollten Sie sich überlegen,
ripgrep
welche Syntax ähnlich ist.quelle
pup
Beispiel using
pup
(das CSS-Selektoren verwendet ):So drucken Sie nur Text ohne Tags, zu verwenden:
pup -f myfile.html tr text{}
.Hier einige Beispiele mit
curl
:xpup
Beispiel
xpup
für die Verwendung von HTML / XML-Analyse (die XPath unterstützt):quelle
Wenn es nur eine kurze Auflistung von
<tr>
s ist, könnte dies helfen:Prost
quelle