nurweilesgeht
Goto Top

Daten aus Website auslesen Bash

Hallo, ich möchte gerne einen Wert, der zwischen zwei anderen Werten steht, aus einer Website auslesen und in eine Variable schreiben. Wie macht man das am besten? Klar, mit curl -s die Seite runterladen, aber da hört mein Wissen auch schon auf. Könnt ihr mir die weiteren Schritte nennen?
Dies versuche ich übrigens mit mit Bash.

Gruß, nurweilesgeht

Content-ID: 590125

Url: https://administrator.de/contentid/590125

Ausgedruckt am: 23.11.2024 um 16:11 Uhr

144705
Lösung 144705 23.07.2020 aktualisiert um 18:01:37 Uhr
Goto Top
Lerne Regular Expressions damit geht alles was dir nur so vorstellen kannst. Vor allem kannst du das überall gebrauchen...
https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/

Dazu noch

grep und sed oder auch awk

und du hast alles was du brauchst.

Hier mal ein einfaches Beispiel um den Titel des Threads dieser Seite auszulesen:
 curl -s --user-agent 'Mozilla' '[content:590125]' | grep -Po '(?<=<span class="title">)[^<]*'
(Das --user-agent ist hier nötig da "administrator.de" offensichtlich den Standard curl agent string mit einem Forbidden bestraft)

Gerade bei solchen Sachen ist es immens von Vorteil sich Regular-Expressions anzueignen, denn sed basiert ebenfalls darauf. Sie sind also in vielen Tools sehr sehr nützlich, nicht nur unter Linux.
GNULinux
Lösung GNULinux 23.07.2020, aktualisiert am 24.07.2020 um 13:40:04 Uhr
Goto Top
Kommt drauf an, was genau du auslesen möchtest. Wenn es wirklich nur etwas ganz einfaches ist, wofür der DOM irrelevant ist (xyz ZIELTEXT abc), dann kann man das mit grep und einem regulären Ausdruck machen. Ich würde allerdings nicht Regex als HTML-Parser missbrauchen, so wie das mein Vorposter bereits andeutet. Das ist schlechte Praxis, weil HTML eine strukturierte Auszeichnungssprache ist und kein regulärer Ausdruck. HTML wird daher geparst, womit Regex schlicht das falsche Werkzeug ist.

Hier mal nur drei Beispiele, in denen die Regex-Variante kein Ergebnis mehr liefert:

<span class="title new-class-for-xyz">...  
<span id="page-title" class="title">...  
<span class='title'>...  

Das kann alles im Alltag geschehen, wenn nur Kleinigkeiten an der Zielseite angepasst werden. Wenn man nun sein Muster anpasst um das alles zu berücksichtigen, wird das ganze ziemlich komplex. Und es gibt oft immer noch Fälle, die man nicht bedacht hat. Einen Parser interessiert das nicht, weil alles valides HTML ist und er anhand des vorgegebenen Kriteriums (z.B. der Klasse) sucht.

Eine bessere Alternative ist daher einen Parser zu nutzen. Gängig ist beispielsweise xmllint, der in einigen Distributionen bereits vorinstalliert ist:

$ curl -s --user-agent 'Mozilla' '[content:590125]' | xmllint --html --nowarning --format --xpath '//span[@class="title"]/text()' - 2>/dev/null  
Daten aus Website auslesen Bash

Disclaimer: Nicht falsch verstehen - Ich will damit nicht sagen, dass Regex oder gar grep schlechte Werkzeuge sind. Im Gegenteil, die sind für ihre Zwecke genial, genau wie sed. Für viele alltägliche Aufgaben hervorragend und ich unterstütze daher die Aufforderung, sich damit zu beschäftigen. Aber was XML/HTML angeht, sind sie der Hammer, mit dem man auf eine Schraube einschlägt.

Da wiederum ist XPath das Schweizer Taschenmesser. Mit der Abfragensprache kannst du so ziemlich jedes Element in einem HTML/XML Dokument ansprechen. Findet nicht nur für dein Vorhaben im Web Scraping Bereich Verwendung, sondern beispielsweise auch für Browertests von Webanwendungen.