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
Dies versuche ich übrigens mit mit Bash.
Gruß, nurweilesgeht
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 590125
Url: https://administrator.de/contentid/590125
Ausgedruckt am: 23.11.2024 um 16:11 Uhr
2 Kommentare
Neuester Kommentar
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:
(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
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">)[^<]*'
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.
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:
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:
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.
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.