Home Assistant: Daten von JEDER Webseite auslesen (Das Multiscrape Tutorial)

Originally published at: Home Assistant: Daten von JEDER Webseite auslesen (Das Multiscrape Tutorial)

In meinem letzten Beitrag zum Thema Webscraping mit Home Assistant habe ich dir gezeigt, wie du mit der Standard-Integration Informationen von nahezu beliebigen Webseiten auslesen kannst. Technisch funktioniert das gut, aber heute zeige ich dir eine Methode, die deutlich mächtiger, effizienter und – gerade bei der Fehlersuche – um Welten besser ist: Multiscrape. Multiscrape ist…

Moin Olli,

vielen lieben Dank für diesen tollen Beitrag :+1:t2:

Könntest Du mir bitte noch kurz sagen, wie der “regex_findall_index” lauten muss, wenn dort eine ‘Klammer auf’ also ‘(‘ enthalten ist und wo ich gute regex-Informationen zum Thema Scrape finden kann?

Vielen Dank im Voraus und viele Grüße aus dem Norden

Micha

Hi Micha,

kannst du ggf. den Code oder gar die Seite teilen, da es (wie so oft im Leben ;)) auf Details ankommt.

Schau mal hier, ob diese Übersicht/”Anleitung” dir die gewünschten Informationen bietet: Der ultimative CSS-Selektor-Spickzettel für Web Scraping - WebDataExtraction

Sonst versuche ich aber auch gerne anhand des konkreten Beispiels zu helden!

VG Olli

der Auszug aus dem Content ist folgender und ich möchte die Jahre auslesen (19,934):

und ich suche nach “rauchfreie Tage! ( 19,934 Jahre"

Versuch es mal hiermit:

multiscrape:
  - resource: "https://DEINE_ZIEL_URL_HIER"
    scan_interval: 3600
    sensor:
      - unique_id: rauchfreie_jahre
        name: "Rauchfreie Jahre"
        # Da der Text nach dem body-Tag steht, greifen wir das gesamte html-Element ab
        select: "html"
        # Wir nutzen string-split, um genau die Zahl zwischen den bekannten Textbausteinen herauszufiltern
        value_template: "{{ value.split('rauchfreie Tage! ( ')[1].split(' Jahre')[0] }}"

Danke für Deine Mühe! die Zahlen sind schonmal da, aber leider getrennt und nicht mit der Kommastelle

:thinking:

Versuch es bitte mal mit:

value_template: "{{ value.split('rauchfreie Tage! ( ')[1].split(' Jahre')[0] | replace(',', '.') | float }}"

wenn der . noch durch ein , ersetzt wird, dann wäre es perfekt

so stimmt die Zahl, aber wird nicht als Zahl angenommen… und “but no default was specified” und ich werden wohl auch keine Freunde…

Ich benötige den Wert auch nicht unbedingt als Zahl und als String wäre es auch ausreichend

…leider kann ich ab sofort nicht mehr antworten (Limit als neuer Benutzer ist erreicht) :slightly_frowning_face:

Nachtrag:

Ich war hier sowas von auf die Entwicklerwerkzeuge fokussiert und habe dabei vollkommen vergessen, dass ich die Einheit ja in der Entität anpassen kann :joy:

Somit ist meine Idee mit Deiner Lösung jetzt perfekt umgesetzt :+1:t2:

Vielen herzlichen Dank für Deine Unterstützung :heart:

Ich habe hier bereits viel gelernt und werde mich jetzt mehr mit Regex beschäftigen :grinning_face:

Du bekommst nun als Entität die 19.xyz, also das ist das, was dir in den Entwicklerwerkzeugen angezeigt wird, oder?

Kannst du fürs bessere Verständnis davon mal einen Screenshot teilen? Also von der Entität in den Entwicklerwerkzeugen?

Moin Olli,

Ich bekomme es einfach nicht hin, die Jahreszahl mit ",” anzuzeigen.

Multiscrape liest die Zahl richtig aus und mit Deiner Lösung wird ja das ",” mit ".” ersetzt und ich kann es auch nicht in der Entität ändern :slightly_frowning_face:

… hast Du noch eine Idee, wie die Entität mit ",” oder als Text angelegt wird?

Wenn ich replace entferne, kannst Du sehen, dass die Jahreszahl richtig ausgelesen wird:

VG Micha

Da haben wir uns ein wenig in die Irre leiten lassen. :face_with_peeking_eye:

Mit folgendem Code solltest du das gewünschte Ergebnis bekommen (zumindest klappt es mit der von dir genannten URL in meinem Produktivsystem):

- name: HA scraper
    resource: DEINE_URL
    sensor:
      - unique_id: rauchfreie_jahren
        name: "Rauchfreie Jahren"
        select: "html"        
        value_template: "{{ value.split('rauchfreie Tage! ( ')[1].split(' Jahre')[0] }}"

Hallo Olli,

im Dashboard wird es bei mir jetzt auch Richtig angezeigt :+1:t2:

In den Entwicklerwerkzeugen → Aktionen bekomme ich wieder folgendes angezeigt (ich habe es damals auch erst in den Entwicklerwerkzeugen getestet)

Ich habe daraus gelernt, dass es einen Unterschied in der Darstellung in den Entwicklerwerkzeugen und im z.B. Dashboard gibt.

Vielen herzlichen Dank nochmals für Deine Mühe und Unterstützung :hugs:

VG Micha

so sieht es jetzt in meinem Dashboard perfekt aus :slightly_smiling_face:

Ich meine, dass Änderungen am Multiscrape-Code in der configuration.yaml erst nach einem Neustart von Home Assistant wirksam werden (und nicht über die Entwicklerwerkzeuge → Alle YAML-Konfigurationen) und ich mag Home Assistant nicht wegen jeder kleinen Anpassungen neu starten… @olli bitte korrigiere mich, falls ich falsch liege…

Nichtsdestotrotz habe ich jetzt den Multiscrape-Code ausgelagert (auch wegen der Übersicht in der configuration.yaml) und in der configuration.yaml eingebunden

Somit ist kein Neustart von Home Assistant mehr notwendig und die Änderungen können über die Entwicklerwerkzeuge neu geladen werden.

VG Micha