it-swarm.com.de

Text zwischen zwei Tags

Ich möchte alles, was sich zwischen diesen beiden Tags befindet - <tr> </tr> - aus einem HTML-Dokument abrufen. Jetzt habe ich keine spezifischen HTML-Anforderungen, die für einen HTML-Parser gerechtfertigt wären. Ich brauche einfach etwas, das mit <tr> Und </tr> Übereinstimmt und alles dazwischen bekommt, und es könnte mehrere trs 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 gehe ich vor?

24
TechJack

Wenn Sie nur ... Von allen <tr>...</tr> Wollen, tun Sie:

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.

15
xx4h

Sie haben eine Anforderung, die einen HTML-Parser garantiert: Sie müssen HTML analysieren. Perls HTML :: TreeBuilder , Pythons BeautifulSoup und andere sind einfach zu verwenden, einfacher als komplexe und spröde reguläre Ausdrücke zu schreiben.

Perl -MHTML::TreeBuilder -le '
    $html = HTML::TreeBuilder->new_from_file($ARGV[0]) or die $!;
    foreach ($html->look_down(_tag => "tr")) {
        print map {$_->as_HTML()} $_->content_list();
    }
' input.html

oder

python -c 'if True:
    import sys, BeautifulSoup
    html = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
    for tr in html.findAll("tr"):
        print "".join(tr.contents)
' input.html

sed und awk sind für diese Aufgabe nicht gut geeignet. Verwenden Sie lieber einen geeigneten HTML-Parser. Zum Beispiel hxselect von w3.org:

<htmlfile hxselect -s '\n' -c 'tr'
9
Thor

Wenn Ruby verfügbar ist, können Sie Folgendes tun

Ruby -e 'puts readlines.join[/(?<=<tr>).+(?=<\/tr>)/m].gsub(/<\/?tr>/, "")' file

dabei ist file Ihre eingegebene HTML-Datei. Der Befehl führt einen Ruby Einzeiler. Zuerst liest er alle Zeilen aus file und verbindet sie mit einer Zeichenfolge, readlines.join. Dann aus der Zeichenfolge Es wählt alles zwischen (aber nicht eingeschlossen) <tr> und <\/tr> aus, das ein Zeichen oder länger ist, unabhängig von Zeilenumbrüchen, [/(?<=<tr>).+(?=<\/tr>)/m]. Dann werden alle <tr> oder </tr> aus der Zeichenfolge gsub(/<\/?tr>/, "") (dies ist erforderlich, um verschachtelte tr -Tags zu verarbeiten). Schließlich wird die Zeichenfolge puts gedruckt.

Sie sagten, dass ein HTML-Parser für Sie nicht garantiert ist, aber es ist sehr einfach zu verwenden Nokogiri mit Ruby und es macht den Befehl einfacher.

Ruby -rnokogiri -e 'puts Nokogiri::HTML(readlines.join).xpath("//tr").map { |e| e.content }' file

-rnokogiri Lädt Nokogiri. Nokogiri::HTML(readlines.join) liest alle Zeilen von file. xpath("//tr") wählt jedes tr Element aus und map { |e| e.content } wählt den Inhalt für jedes Element aus, d. h. was zwischen <tr> und </tr> liegt.

5
N.N.

grep

Um Inhalte innerhalb des Tags tr über mehrere Zeilen hinweg abzurufen, führen Sie sie zuerst durch xargs, zum Beispiel:

curl -sL https://www.iana.org/ | xargs | egrep -o "<tr>.*?</tr>"

Verwenden Sie Folgendes, um nur inneres HTML zurückzugeben:

curl -sL https://www.iana.org/ | xargs | grep -Po "<tr>\K(.*?)</tr>" | sed "s/..tr.//g"

Überprüfen Sie die Syntax für perlre erweiterte Muster .

Hinweis: Für eine schnellere Leistung können Sie ripgrep in Betracht ziehen, das eine ähnliche Syntax aufweist.

1
kenorb

wenn es sich nur um eine kurze Auflistung von <tr> handelt, könnte dies helfen:

Perl -ne 'print if /<tr>/../</tr>/' your.html > TRs.log

prost

0
eswues

pup

Beispiel mit pup (mit CSS-Selektoren ):

pup -f myfile.html tr

Verwenden Sie Folgendes, um nur Text ohne Tags zu drucken: pup -f myfile.html tr text{}.

Hier einige Beispiele mit curl:

curl -sL https://www.iana.org/ | pup tr text{}
pup -f <(curl -sL https://www.iana.org/) tr text{}

xpup

Beispiel mit xpup für die HTML/XML-Analyse (die XPath unterstützt):

xpup -f myfile.html "//tr"
0
kenorb