Bash: HTML-Quelltext filtern

moonwalker99

Lt. Commander
Registriert
Jan. 2008
Beiträge
1.932
Ich möchte ein Skript erstellen, mit dem ich den HTML-Quelltext einer URL filtern kann. Mit curl hole ich mir die HTML-Seite und schreibe sie in eine Variable. Die Seite enthält 3 Tabellen, also:

Code:
<table class=(...)>
(...)
</table>

Ich möchte aus dem ganzen Code nur die zweite Tabelle behalten, der restliche Code soll entfernt werden. Wie kann ich das machen? Evtl. mit perl?

Der HTML-Code enthält auch viele Zeilenumbrüche. Das sollte klar sein.
 
xmlstarlet

HTML:
<html>
    <body>
        <table><th>1</th><tr><td>1</td></tr></table>
        <table><th>2</th><tr><td>2</td></tr></table>
        <table><th>3</th><tr><td>3</td></tr></table>
    </body>
</html>

Code:
$ xmlstarlet sel -t -c "/html/body/table[2]" test.html
<table><th>2</th><tr><td>2</td></tr></table>

du musst nur den richtigen xpath zu deiner tabelle finden.

edit: das kannst du natürlich mit einer sprache deiner wahl machen. html ist auch nur xml und mittels eines xpath findest du deine tabelle:

Python:
import requests
from lxml import etree

r = requests.get('http://example.com/test.html')
html = etree.fromstring(r.text, parser=etree.HTMLParser())
table = html.find('body/table[2]')
print(etree.tostring(table, pretty_print=True, encoding=str))
 
Zuletzt bearbeitet:
Sieht interessant aus. Kann ich das auch innerhalb eines bash-Skriptes nutzen?
 
xmlstarlet kannst du natürlich auch in einem bash script verwenden:

Code:
table=$(xmlstarlet sel -t -c "/html/body/table[2]" test.html)
echo $table


edit: es wird noch empfohlen, xmlstarlet zu sagen, dass es sich um html handelt:
Code:
curl -s https://www.computerbase.de | xmlstarlet fo -H -R 2> /dev/null | xmlstarlet sel -t -c '/html/body/header'
 
Zuletzt bearbeitet:
Zurück
Oben