Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. [gelöst] Funktion gibt kein result aus und JS erweitern

    NEWS

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker goes Matter ... Matter Adapter in Stable

    [gelöst] Funktion gibt kein result aus und JS erweitern

    This topic has been deleted. Only users with topic management privileges can see it.
    • Marc Berg
      Marc Berg Most Active @David G. last edited by

      @david-g sagte in Funktion gibt kein result aus:

      Wie müsste es denn dann sein damit es klappt?

      Wenn du eine Variable nicht mit let oder const deklarierst, wird sie automatisch zur globalen Variable (dein zweites Beispiel). Mit der Deklaration im ersten Beispiel wird der Scope auf innerhalb der Funktion begrenzt. Eine schnelle (wenn auch nicht ganz saubere) Lösung wäre also, die Deklaration per "const" wegzulassen.

      David G. 1 Reply Last reply Reply Quote 0
      • David G.
        David G. @Marc Berg last edited by

        @marc-berg

        Also die Zeile

              const result = JSON.stringify(alleErgebnisse, null, 2);
        

        zu

              result = JSON.stringify(alleErgebnisse, null, 2);
        

        abändern?

        Marc Berg 1 Reply Last reply Reply Quote 0
        • Marc Berg
          Marc Berg Most Active @David G. last edited by

          @david-g

          Das wäre jetzt mein Quick Hack, wenn es sicher auch schönere Lösungen gibt.

          David G. 1 Reply Last reply Reply Quote 0
          • David G.
            David G. @Marc Berg last edited by David G.

            @marc-berg

            Macht leider keinen unterschied.....

            Auch bekommt Mr. GPT nicht die weitere Infos ausgelesen die ich gerne noch hätte.
            Ich würde gerne neben dem Namen und dem Bild noch das Geburts- und Sterbedatum auslesen.

            Dieser Beriech wiederholt sich mehrmals auf den ausgelesenen Seiten mit den Infos.

            <div class="col-12 d-flex align-items-stretch" >
            
            
            
            <div class="c-blockitem text-center c-blockitem-noborder c-blockitem-nobg c-blockitem-noshadow c-blockitem-heading-center" id="karin-pilch">
                
                <div class="c-blockitem-heading"><h2 class="c-blockitem-title"><a href="https://www.57trauer.de/traueranzeige/karin-pilch" class="" title="Anzeige Karin Pilch geb. Becker"  >Anzeige Karin Pilch geb. Becker</a></h2><div  class="c-blockitem-subtitle">* 10.03.1943 - † 03.09.2023</div></div>
            
            
                <div class="mt-3 row">
                                <div class="col-12">
                                       <a href="https://www.57trauer.de/traueranzeige/karin-pilch" class="" title="Traueranzeige von Karin Pilch von Siegener Zeitung" >
                                            <img src="/MEDIASERVER/content/LH186/obi_new/2023_9/karin-pilch-traueranzeige-3b4ca367-d074-4e50-bd49-7924ec55c1eb.jpg" loading="lazy" class="img-fluid  mb-1 h-auto" title="Traueranzeige von Karin Pilch von Siegener Zeitung" alt="Traueranzeige von Karin Pilch von Siegener Zeitung"  />
                                        </a>   
                                </div>
                                <div class="col-12 mt-0 pt-0 mb-3">
                                    <span class="text-muted"><i class="c-icon c-icon-calendar"></i> veröffentlicht am <strong>06.09.2023</strong> in <strong>Siegener Zeitung</strong></span>
                                </div> 
                </div>
            

            EDIT:
            Evtl hat @OliverIO eine Idee um an die Daten zu kommen. Gerne als Sting mit dem * und +.
            Schreibe das json jetzt einfach in einen DP. So hat sich das mit dem result erledigt.

            OliverIO 1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @David G. last edited by

              @david-g
              Mir cheerio warst schon mal gut unterwegs.
              Leider muss man da etwas tüfteln. Auch reicht der Ausschnitt einer Seite nicht aus. Das muss man auf Basis der ganzen Seite analysieren.

              Cheerio ist ja die Nachbildung von jquery für den Server (also nodejs)
              Grund Funktion basiert auf den css selektoren.
              https://wiki.selfhtml.org/wiki/CSS/Selektoren
              Darüber kann man mit relativ kurzen Anweisungen irgend ein Element in einer html Seite adressieren und dann auch den Wert auslesen.

              Bin allerdings gerade im Urlaub. Kann erst nächste Woche wieder schauen.
              Ich benötige die url bzw. Einmal den vollständigen Quelltext
              Und die Auflistung welche Tele du genau haben willst

              David G. 1 Reply Last reply Reply Quote 0
              • David G.
                David G. @OliverIO last edited by David G.

                @oliverio

                Cool,

                danke.

                Dann mach jetzt erstmal schön Urlaub.
                Und dann erstmal ganz gemach in den Alltag kommen ^^.


                Die URL ist
                https://www.57trauer.de/traueranzeigen-suche/letzte-14-Tage/seite-1

                Was das aktuelle Skript macht:

                • Den Link zum Bild (Traueranzeige) auslesen und den Fehlenden Teil vor den Pfad setzen.
                • Den title="Traueranzeige von Gertrud Cimander von Siegener Zeitung" auslesen und nur den Text zwischen den beiden "von" nehmen.
                • Am Seitenende die Gesamtseiten mit Ergebnissen erfassen und für die Folgeseiten auch die Daten abrufen (idr um die 30 Seiten).
                • Das alles in eine JSON schreiben

                Was mir fehlt: Die Geburts- und Todesdaten auslesen. * 21.07.1933 - † 04.09.2023. Gerne auch so am Stück als String

                Als Ausschnitt sieht eine Todesanzeige so aus:

                <div class="col-12 d-flex align-items-stretch" >
                
                
                
                <div class="c-blockitem text-center c-blockitem-noborder c-blockitem-nobg c-blockitem-noshadow c-blockitem-heading-center" id="gertrud-cimander">
                    
                    <div class="c-blockitem-heading"><h2 class="c-blockitem-title"><a href="https://www.57trauer.de/traueranzeige/gertrud-cimander" class="" title="Anzeige Gertrud Cimander geb. Weber"  >Anzeige Gertrud Cimander geb. Weber</a></h2><div  class="c-blockitem-subtitle">* 21.07.1933 - † 04.09.2023</div></div>
                
                
                    <div class="mt-3 row">
                                    <div class="col-12">
                                           <a href="https://www.57trauer.de/traueranzeige/gertrud-cimander" class="" title="Traueranzeige von Gertrud Cimander von Siegener Zeitung" >
                                                <img src="/MEDIASERVER/content/LH186/obi_new/2023_9/gertrud-cimander-traueranzeige-7f9a6160-32e6-4bee-bdec-faf7b6e08f73.jpg" loading="lazy" class="img-fluid  mb-1 h-auto" title="Traueranzeige von Gertrud Cimander von Siegener Zeitung" alt="Traueranzeige von Gertrud Cimander von Siegener Zeitung"  />
                                            </a>   
                                    </div>
                                    <div class="col-12 mt-0 pt-0 mb-3">
                                        <span class="text-muted"><i class="c-icon c-icon-calendar"></i> veröffentlicht am <strong>06.09.2023</strong> in <strong>Siegener Zeitung</strong></span>
                                    </div> 
                    </div>
                

                Das ist der ganze Quellcode:
                code.txt

                Und hier mein aktuelles Script:

                const axios = require('axios');
                const cheerio = require('cheerio');
                
                // Die URL-Basis der Webseite
                const baseUrl = 'https://www.57trauer.de/traueranzeigen-suche/letzte-14-Tage/seite-';
                
                // Eine Funktion, um die Anzahl der verfügbaren Seiten zu ermitteln
                async function ermittleAnzahlDerSeiten() {
                  try {
                    // Die Webseite mit Axios abrufen
                    const response = await axios.get(baseUrl + '1');
                
                    // Den HTML-Inhalt mit Cheerio analysieren
                    const $ = cheerio.load(response.data);
                
                    // Das Element mit der Anzahl der Seiten finden und die Anzahl extrahieren
                    const anzahlDerSeiten = parseInt($('.pagination li').last().prev().text());
                
                    return anzahlDerSeiten;
                  } catch (error) {
                    console.error('Fehler beim Abrufen der Anzahl der Seiten:', error);
                    return 0;
                  }
                }
                
                // Eine Funktion, um die Informationen von einer bestimmten Seite zu extrahieren
                async function extrahiereInformationenVonSeite(seite) {
                  try {
                    // Die Webseite mit Axios abrufen
                    const response = await axios.get(baseUrl + seite);
                
                    // Den HTML-Inhalt mit Cheerio analysieren
                    const $ = cheerio.load(response.data);
                
                    // Eine leere Liste für die Ergebnisse
                    const ergebnisse = [];
                
                    // Alle div-Elemente mit der Klasse "mt-3 row" finden und durch sie iterieren
                    $('div.mt-3.row').each((index, div) => {
                      const aTag = $(div).find('a');
                      if (aTag.length > 0) {
                        const titleFull = aTag.attr('title');
                        // Den relevanten Text zwischen "Traueranzeige von" und "von Siegener Zeitung" extrahieren
                        const match = titleFull.match(/Traueranzeige von (.*?) von Siegener Zeitung/);
                        if (match) {
                          const relevantText = match[1];
                          // Den Link zum Bild vor "https://www.57trauer.de" setzen
                          const imgSrc = 'https://www.57trauer.de' + aTag.find('img').attr('src');
                          // Die Informationen in ein Objekt speichern und zur Liste hinzufügen
                          const ergebnis = { title: relevantText, jpg: imgSrc };
                          ergebnisse.push(ergebnis);
                        }
                      }
                    });
                
                    return ergebnisse;
                  } catch (error) {
                    console.error('Fehler beim Extrahieren von Informationen von Seite ' + seite + ':', error);
                    return [];
                  }
                }
                // Die Anzahl der verfügbaren Seiten ermitteln
                ermittleAnzahlDerSeiten()
                  .then(async (anzahlDerSeiten) => {
                    if (anzahlDerSeiten > 0) {
                      // Eine leere Liste für alle Ergebnisse
                      const alleErgebnisse = [];
                
                      // Durch alle Seiten iterieren und die Informationen extrahieren
                      for (let seite = 1; seite <= anzahlDerSeiten; seite++) {
                        const ergebnisseVonSeite = await extrahiereInformationenVonSeite(seite);
                        alleErgebnisse.push(...ergebnisseVonSeite);
                      }
                
                      // Die gesamten Ergebnisse in die Variable "result" speichern
                
                      result = JSON.stringify(alleErgebnisse, null, 2);
                
                      // Die Informationen aus der Variable "result" über die Konsole ausgeben
                      console.log(result);
                      setState("0_userdata.0.trauer"/*trauer*/, result, true);
                
                    } else {
                      console.log('Keine Seiten gefunden.');
                    }
                  })
                  .catch((error) => {
                    console.error('Fehler:', error);
                  });
                return result
                
                OliverIO 1 Reply Last reply Reply Quote 0
                • OliverIO
                  OliverIO @David G. last edited by

                  @david-g sagte in Funktion gibt kein result aus und JS Funktion erweitern:

                  ah etwas pikante informationen

                  du warst schon auf einem guten weg.
                  ich habe die einzelnen aufgaben in einzelne funktionen gepackt
                  und noch einen useragent-header hinzugefügt, so das der abruf auch so aussieht wie von einem browser
                  darüber hinaus habe ich noch geburts und sterbedatum mit in die infos mit reingepackt.
                  die bilder habe ich zu einem array gemacht, da es manchmal auch mehrere anzeigen zu einem namen gibt
                  den namen habe ich nicht aus dem bild genommen, da es nicht immer ein bild gibt

                  const axios = require('axios');
                  const cheerio = require('cheerio');
                   
                  const domain = 'https://www.57trauer.de';   // domain für die bilder
                  const baseUrl = 'https://www.57trauer.de/traueranzeigen-suche/letzte-14-Tage/seite-'; //abruf url
                  const userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"; //user agent, so das der abruf wie von einem browser aussieht, ansonsten verwendet axios seinen eigenen ua-string
                  let info=[]; //array in dem  alle infos gesammelt werden
                  
                  async function main() {
                  
                      let p1 = await readPage(1); //lesen der ersten seite
                      let px = await countPages(p1); // ermitteln wieviele seiten
                      let p=p1;
                      for (var i=2;i<=px;i++) {
                          getInformations(p,info); //informationen je seite einsammeln
                          p=await readPage(i); //nächste seite lesen
                          console.log("page "+i); 
                      }
                  console.log(info);  //ausgabe aller ergebnisse
                  }
                  
                  //alle informationen einer seite einsammeln
                  async function getInformations(data,info) {
                      const $ = cheerio.load(data);
                      //alle anzeigen einer seite ermitteln und abklappern
                      $('.col-12.d-flex.align-items-stretch').each((index, el) => {
                          let obj=[]; //objekt zum einsammeln der informationen zu einer anzeige erzeugen
                          obj.images=getImages(el)||[]; //alle bilder einer anzeige lesen
                          obj.title = getTitle(el)||""; //den namen einer anzeige lesen
                          obj.birth = getBirth(el)||""; //geburtsdatum
                          obj.death = getDeath(el)||""; //sterbedatum
                          info.push(obj);  //alle infos einer anzeige dem array hinzufügen
                      });
                  }
                  //geburtsdatum ermitteln
                  function getBirth(data) {
                      const $ = cheerio.load(data);
                      let match = $(".c-blockitem-subtitle").html().match(/\* ([\d\.]+) - † ([\d\.]+)/);
                      if (match) {
                          return match[1];
                      } else {
                          return "";
                      }
                  }
                  //sterbedatum ermitteln
                  function getDeath(data) {
                      const $ = cheerio.load(data);
                      let match = $(".c-blockitem-subtitle").html().match(/\* ([\d\.]+) - † ([\d\.]+)/);
                      if (match) {
                          return match[2];
                      } else {
                          return "";
                      }
                  }
                  //alle anzeigenbilder ermitteln und als array zurückgeben
                  function getImages(data) {
                      const $ = cheerio.load(data);
                      return $("img").map((i,el)=>domain+$(el).attr("src")).toArray();
                  }
                  //den namen ermitteln und zurückgeben
                  function getTitle(data) {
                      const $ = cheerio.load(data);
                      let title = $("a:first").attr("title").match(/Anzeige (.+)/);
                      if (title) {
                          return title[1];
                      } else {
                          return "";
                      }
                  
                  }
                  //die anzahl aller seiten ermitteln
                  async function countPages(data) {
                      const $ = cheerio.load(data);
                      return parseInt($(".pagination:first .page-item a").eq(-2).html());
                  }
                  //eine seite mit der angegebenen seitennummer abrufen
                  async function readPage(page) {
                    try {
                      const response = await axios.get(baseUrl + page,{
                          headers: {
                              userAgent: userAgent
                          }
                      });
                   
                      return response.data;
                    } catch (error) {
                      console.error('Fehler Abruf Seite: '+page, error);
                      return 0;
                    }
                  
                  }
                  
                  main();
                  
                  
                  
                  David G. 2 Replies Last reply Reply Quote 1
                  • David G.
                    David G. @OliverIO last edited by

                    @oliverio

                    Danke, morgen Abend kann ich es bei mir testen.
                    Den ganzen Tag auf Messe.

                    1 Reply Last reply Reply Quote 0
                    • David G.
                      David G. @OliverIO last edited by

                      @oliverio

                      Hab es jetzt mal in Blockly in einen Funktiobsbaustein gepackt.
                      Im Log erhalte ich dann nur ein:

                      07:33:26.892	info	javascript.0 (23527) script.js.Eigene_Scripte.Test: []
                      

                      Ist es möglich das JSON mit den Daten in einen DP zu schreiben oder in die Variable "result" (Die Variable darf aber wie ich weiter oben gelesen habe nicht definiert sein, damit mir der Blockly Block diese zurückgeben kann).

                      Die JSON kann ich dann schön in Blockly weiterverarbeiten.
                      47cdb9a5-5c45-4c49-873a-4e0127e20d98-image.png

                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @David G. last edited by

                        @david-g
                        Mit blockly kenne ich mich nicht so aus.
                        Am besten du schreibst das in ein JavaScript script

                        In einen datenpunkt Schreiben kannst du es mit setState in Zeile 19
                        Dein blockly trigger dann am besten auf Änderung dieses datenpunktes

                        David G. 1 Reply Last reply Reply Quote 0
                        • David G.
                          David G. @OliverIO last edited by

                          @oliverio

                          Wenn ich es in ein JS Skript einfüge bekomme ich auch kein Ergebnis:

                          07:23:34.119	info	javascript.0 (23527) Start javascript script.js.Eigene_Scripte.trauertest
                          07:23:34.129	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                          07:23:35.589	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: []
                          
                          OliverIO 1 Reply Last reply Reply Quote 0
                          • OliverIO
                            OliverIO @David G. last edited by OliverIO

                            @david-g

                            wenn du in das script gegangen bist und es laufen lassen hast, sind da keine Meldungen gekommen?

                            Leider können die Variationen in der Ausgabe relativ vielfältig sein. Wenn die nicht berücksichtigt werden, dann führt das zu fehlern, die behoben werden müssen.

                            Bei den aktuellen Anzeigen, waren welche ohne Geburtsdatum oder gar komplett ohne Daten dabei.
                            Das ist jetzt in der folgenden Version berücksichtigt.

                            Ausserdem hab ich noch einen Fehler korrigiert, bei dem sich der Lauf des Skriptes in vscode zu iobroker unterscheidet

                            const axios = require('axios');
                            const cheerio = require('cheerio');
                             
                            const domain = 'https://www.57trauer.de';   // domain für die bilder
                            const baseUrl = 'https://www.57trauer.de/traueranzeigen-suche/letzte-14-Tage/seite-'; //abruf url
                            const userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"; //user agent, so das der abruf wie von einem browser aussieht, ansonsten verwendet axios seinen eigenen ua-string
                            let info=[]; //array in dem  alle infos gesammelt werden
                            
                            async function main() {
                            
                                let p1 = await readPage(1); //lesen der ersten seite
                                let px = await countPages(p1); // ermitteln wieviele seiten
                                console.log("Anzahl Seiten "+px)
                                let p=p1;
                                for (var i=2;i<=px;i++) {
                                    getInformations(p,info); //informationen je seite einsammeln
                                    p=await readPage(i); //nächste seite lesen
                                }
                            console.log(info);  //ausgabe aller ergebnisse
                            }
                            
                            //alle informationen einer seite einsammeln
                            async function getInformations(data,info) {
                                const $ = cheerio.load(data);
                                //alle anzeigen einer seite ermitteln und abklappern
                                $('.col-12.d-flex.align-items-stretch').each((index, el) => {
                                    let obj={}; //objekt zum einsammeln der informationen zu einer anzeige erzeugen
                                    obj.images=getImages(el)||[]; //alle bilder einer anzeige lesen
                                    obj.title = getTitle(el)||""; //den namen einer anzeige lesen
                                    obj.birth = getBirth(el)||""; //geburtsdatum
                                    obj.death = getDeath(el)||""; //sterbedatum
                                    info.push(obj);  //alle infos einer anzeige dem array hinzufügen
                                });
                            }
                            //geburtsdatum ermitteln
                            function getBirth(data) {
                                const $ = cheerio.load(data);
                                let html=$(".c-blockitem-subtitle").html();
                                if (!html) return "";
                                let match = html.match(/\* ([\d\.]+)/);
                                if (match) {
                                    return match[1];
                                } else {
                                    return "";
                                }
                            }
                            //sterbedatum ermitteln
                            function getDeath(data) {
                                const $ = cheerio.load(data);
                                let html=$(".c-blockitem-subtitle").html();
                                if (!html) return "";
                                let match = html.match(/ - † ([\d\.]+)/);
                                if (match) {
                                    return match[1];
                                } else {
                                    return "";
                                }
                            }
                            //alle anzeigenbilder ermitteln und als array zurückgeben
                            function getImages(data) {
                                const $ = cheerio.load(data);
                                return $("img").map((i,el)=>domain+$(el).attr("src")).toArray();
                            }
                            //den namen ermitteln und zurückgeben
                            function getTitle(data) {
                                const $ = cheerio.load(data);
                                let title = $("a:first").attr("title").match(/Anzeige (.+)/);
                                if (title) {
                                    return title[1];
                                } else {
                                    return "";
                                }
                            
                            }
                            //die anzahl aller seiten ermitteln
                            async function countPages(data) {
                                const $ = cheerio.load(data);
                                return parseInt($(".pagination:first .page-item a").eq(-2).html());
                            }
                            //eine seite mit der angegebenen seitennummer abrufen
                            async function readPage(page) {
                              try {
                                const response = await axios.get(baseUrl + page,{
                                    headers: {
                                        userAgent: userAgent
                                    }
                                });
                            console.log("page "+page); 
                            console.log("status "+response.status); 
                             
                                return response.data;
                              } catch (error) {
                                console.error('Fehler Abruf Seite: '+page, error);
                                return 0;
                              }
                            
                            }
                            
                            main();
                            
                            
                            David G. 1 Reply Last reply Reply Quote 0
                            • David G.
                              David G. @OliverIO last edited by

                              @oliverio

                              Das möchte auch nicht.
                              Am Stück in ein JS Skript kopiert und wie es ist abgespeichert.

                              Mehr kommt nicht:

                              14:32:14.564	info	javascript.0 (23527) Stop script script.js.Eigene_Scripte.trauertest
                              14:32:14.569	info	javascript.0 (23527) Start javascript script.js.Eigene_Scripte.trauertest
                              14:32:14.579	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                              14:32:14.959	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: []
                              
                              OliverIO 1 Reply Last reply Reply Quote 0
                              • OliverIO
                                OliverIO @David G. last edited by OliverIO

                                @david-g

                                das was du da kopierst, sieht immer so aus, als ob du es aus dem iobroker-log nimmst.
                                kannst du bitte mal hier schauen?
                                www_screencapture_com_2023-9-14_14_49.mp4

                                mit dem original skript wird dann am ende in dem log, das array ausgegeben.

                                ich habe oben mal noch eine debug-zeile eingefügt, bitte script nochmal aktualisieren

                                David G. 1 Reply Last reply Reply Quote 0
                                • David G.
                                  David G. @OliverIO last edited by

                                  @oliverio

                                  So ist es bei mir:

                                  drop.gif

                                  OliverIO 1 Reply Last reply Reply Quote 0
                                  • OliverIO
                                    OliverIO @David G. last edited by OliverIO

                                    @david-g

                                    ok,
                                    und axios und cheerio ist auch in den Einstellungen des javascript adapters als zusätzliche module eingetragen?

                                    es sieht so aus, wie wenn der seitenabruf von axios nicht geht, allerdings ohne eine fehlermeldung zu werfen.
                                    ich habe hier nochmal ein paar mehr debug outputs reingemacht.

                                    const axios = require('axios');
                                    const cheerio = require('cheerio');
                                     
                                    const domain = 'https://www.57trauer.de';   // domain für die bilder
                                    const baseUrl = 'https://www.57trauer.de/traueranzeigen-suche/letzte-14-Tage/seite-'; //abruf url
                                    const userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"; //user agent, so das der abruf wie von einem browser aussieht, ansonsten verwendet axios seinen eigenen ua-string
                                    let info=[]; //array in dem  alle infos gesammelt werden
                                    
                                    async function main() {
                                    console.log("F main "); 
                                    
                                        let p1 = await readPage(1); //lesen der ersten seite
                                    console.log(p1);  //ausgabe aller ergebnisse
                                        let px = await countPages(p1); // ermitteln wieviele seiten
                                        console.log("Anzahl Seiten "+px)
                                        let p=p1;
                                        for (var i=2;i<=px;i++) {
                                            getInformations(p,info); //informationen je seite einsammeln
                                            p=await readPage(i); //nächste seite lesen
                                        }
                                    console.log(info);  //ausgabe aller ergebnisse
                                    }
                                    
                                    //alle informationen einer seite einsammeln
                                    async function getInformations(data,info) {
                                        const $ = cheerio.load(data);
                                        //alle anzeigen einer seite ermitteln und abklappern
                                        $('.col-12.d-flex.align-items-stretch').each((index, el) => {
                                            let obj={}; //objekt zum einsammeln der informationen zu einer anzeige erzeugen
                                            obj.images=getImages(el)||[]; //alle bilder einer anzeige lesen
                                            obj.title = getTitle(el)||""; //den namen einer anzeige lesen
                                            obj.birth = getBirth(el)||""; //geburtsdatum
                                            obj.death = getDeath(el)||""; //sterbedatum
                                            info.push(obj);  //alle infos einer anzeige dem array hinzufügen
                                        });
                                    }
                                    //geburtsdatum ermitteln
                                    function getBirth(data) {
                                        const $ = cheerio.load(data);
                                        let html=$(".c-blockitem-subtitle").html();
                                        if (!html) return "";
                                        let match = html.match(/\* ([\d\.]+)/);
                                        if (match) {
                                            return match[1];
                                        } else {
                                            return "";
                                        }
                                    }
                                    //sterbedatum ermitteln
                                    function getDeath(data) {
                                        const $ = cheerio.load(data);
                                        let html=$(".c-blockitem-subtitle").html();
                                        if (!html) return "";
                                        let match = html.match(/ - † ([\d\.]+)/);
                                        if (match) {
                                            return match[1];
                                        } else {
                                            return "";
                                        }
                                    }
                                    //alle anzeigenbilder ermitteln und als array zurückgeben
                                    function getImages(data) {
                                        const $ = cheerio.load(data);
                                        return $("img").map((i,el)=>domain+$(el).attr("src")).toArray();
                                    }
                                    //den namen ermitteln und zurückgeben
                                    function getTitle(data) {
                                        const $ = cheerio.load(data);
                                        let title = $("a:first").attr("title").match(/Anzeige (.+)/);
                                        if (title) {
                                            return title[1];
                                        } else {
                                            return "";
                                        }
                                    
                                    }
                                    //die anzahl aller seiten ermitteln
                                    async function countPages(data) {
                                        const $ = cheerio.load(data);
                                        return parseInt($(".pagination:first .page-item a").eq(-2).html());
                                    }
                                    //eine seite mit der angegebenen seitennummer abrufen
                                    async function readPage(page) {
                                    console.log("F readPage "); 
                                      try {
                                        const response = await axios.get(baseUrl + page,{
                                            headers: {
                                                userAgent: userAgent
                                            }
                                        });
                                    console.log("page "+page); 
                                    console.log("status "+response.status); 
                                     
                                        return response.data;
                                      } catch (error) {
                                        console.error('Fehler Abruf Seite: '+page, error);
                                        return 0;
                                      }
                                    
                                    }
                                    
                                    main();
                                    
                                    
                                    David G. 1 Reply Last reply Reply Quote 0
                                    • David G.
                                      David G. @OliverIO last edited by David G.

                                      @oliverio

                                      Jetzt kommt im Log:

                                      9:51:07.191	info	javascript.0 (23527) Stop script script.js.Eigene_Scripte.trauertest
                                      09:51:07.243	info	javascript.0 (23527) Start javascript script.js.Eigene_Scripte.trauertest
                                      09:51:07.252	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: F main
                                      09:51:07.252	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: F readPage
                                      09:51:07.254	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                                      09:51:08.633	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: page 1
                                      09:51:08.633	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: status 200
                                      09:51:08.633	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: <!DOCTYPE html> <html lang="de" dir="ltr"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <meta name="description" content="Lesen Sie aktuelle Traueranzeigen und Todesanzeigen der letzten 14 Tage aus Ihrer Tageszeitung und gedenken Sie Ihren Verstorbenen." /> <link rel="canonical" href="https://www.57trauer.de/traueranzeigen-suche/letzte-14-tage/seite-1" /> <meta property="og:title" content="Traueranzeigen der letzten 14 Tage | 57trauer.de" /> <meta property="og:description" content="..............
                                      09:51:08.680	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: Anzahl Seiten NaN
                                      09:51:08.680	info	javascript.0 (23527) script.js.Eigene_Scripte.trauertest: []
                                      

                                      (Zeile 11 steht nicht im Log, macht das Forum irgendwie da hin ....)
                                      axios und cheeriosind aktiv. "Mein" Skript lauft ja durch und braucht auch beides.

                                      OliverIO 1 Reply Last reply Reply Quote 0
                                      • OliverIO
                                        OliverIO @David G. last edited by

                                        @david-g said in Funktion gibt kein result aus und JS Funktion erweitern:

                                        t: <!DOCTYPE html> <html lang="de" dir="ltr"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" /> <meta name="description" content="Lesen Sie aktuelle Traueranzeigen und Todesanzeigen der letzten 14 Tage aus Ihrer Tageszeitung und gedenken Sie Ihren Verstorbenen." /> <link rel="canonical" href="https://www.57trauer.de/traueranzeigen-suche/letzte-14-tage/seite-1" /> <meta property="og:title" content="Traueranzeigen der letzten 14 Tage | 57trauer.

                                        ok,
                                        also seite 1 wird abgerufen,
                                        aber die Anzahl der Seiten kann nicht ermittelt werden.
                                        Bist du mit einem Account dort angemeldet?
                                        Irgendwie ist da die Seite anders aufgebaut, so das er die Zahl nicht findet
                                        Hab gerade bei mir nochmal probiert. Da klappt es jedes mal.
                                        Kannst du das ausgegebenen HTML, welches nur gekürzt angezeigt wird, hier posten? Dann kann ich schauen warum er die Zahl nicht findet.

                                        David G. 1 Reply Last reply Reply Quote 0
                                        • David G.
                                          David G. @OliverIO last edited by

                                          @oliverio

                                          Anbei das ganze Log mit Quellcode:
                                          log.txt

                                          Hier der Bereich mit den Seitenzahlen:

                                                               <ul class="pagination">
                                          
                                                                                                    <li class="page-item active"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-1">1</a></li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-2">2</a></li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-3">3</a></li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-4">4</a></li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-5">5</a></li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-6">6</a></li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-7">7</a></li>
                                                                           <li class="page-item">...</li>
                                                                           <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-24">24</a></li>
                                          
                                                                       <li class="page-item"><a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-2">></a></li>
                                                               </ul>
                                          
                                          OliverIO 1 Reply Last reply Reply Quote 0
                                          • OliverIO
                                            OliverIO @David G. last edited by

                                            @david-g

                                            leider sieht das normal aus.
                                            das folgende skript nochmal mit weiteren debug ausgaben
                                            Interessant wäre die Seite mit der folgenden Ausgabe oder so ähnlich:

                                            Element Anzahl Seiten:<a class="page-link" href="/traueranzeigen-suche/letzte-14-Tage/seite-24">24</a>
                                            
                                            
                                            const axios = require('axios');
                                            const cheerio = require('cheerio');
                                             
                                            const domain = 'https://www.57trauer.de';   // domain für die bilder
                                            const baseUrl = 'https://www.57trauer.de/traueranzeigen-suche/letzte-14-Tage/seite-'; //abruf url
                                            const userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"; //user agent, so das der abruf wie von einem browser aussieht, ansonsten verwendet axios seinen eigenen ua-string
                                            let info=[]; //array in dem  alle infos gesammelt werden
                                            
                                            async function main() {
                                            console.log("F main "); 
                                            
                                                let p1 = await readPage(1); //lesen der ersten seite
                                                let px = await countPages(p1); // ermitteln wieviele seiten
                                                console.log("Anzahl Seiten "+px)
                                                let p=p1;
                                                for (var i=2;i<=px;i++) {
                                                    getInformations(p,info); //informationen je seite einsammeln
                                                    p=await readPage(i); //nächste seite lesen
                                                }
                                            console.log(info);  //ausgabe aller ergebnisse
                                            }
                                            
                                            //alle informationen einer seite einsammeln
                                            async function getInformations(data,info) {
                                                const $ = cheerio.load(data);
                                                //alle anzeigen einer seite ermitteln und abklappern
                                                $('.col-12.d-flex.align-items-stretch').each((index, el) => {
                                                    let obj={}; //objekt zum einsammeln der informationen zu einer anzeige erzeugen
                                                    obj.images=getImages(el)||[]; //alle bilder einer anzeige lesen
                                                    obj.title = getTitle(el)||""; //den namen einer anzeige lesen
                                                    obj.birth = getBirth(el)||""; //geburtsdatum
                                                    obj.death = getDeath(el)||""; //sterbedatum
                                                    info.push(obj);  //alle infos einer anzeige dem array hinzufügen
                                                });
                                            }
                                            //geburtsdatum ermitteln
                                            function getBirth(data) {
                                                const $ = cheerio.load(data);
                                                let html=$(".c-blockitem-subtitle").html();
                                                if (!html) return "";
                                                let match = html.match(/\* ([\d\.]+)/);
                                                if (match) {
                                                    return match[1];
                                                } else {
                                                    return "";
                                                }
                                            }
                                            //sterbedatum ermitteln
                                            function getDeath(data) {
                                                const $ = cheerio.load(data);
                                                let html=$(".c-blockitem-subtitle").html();
                                                if (!html) return "";
                                                let match = html.match(/ - † ([\d\.]+)/);
                                                if (match) {
                                                    return match[1];
                                                } else {
                                                    return "";
                                                }
                                            }
                                            //alle anzeigenbilder ermitteln und als array zurückgeben
                                            function getImages(data) {
                                                const $ = cheerio.load(data);
                                                return $("img").map((i,el)=>domain+$(el).attr("src")).toArray();
                                            }
                                            //den namen ermitteln und zurückgeben
                                            function getTitle(data) {
                                                const $ = cheerio.load(data);
                                                let title = $("a:first").attr("title").match(/Anzeige (.+)/);
                                                if (title) {
                                                    return title[1];
                                                } else {
                                                    return "";
                                                }
                                            
                                            }
                                            //die anzahl aller seiten ermitteln
                                            async function countPages(data) {
                                                const $ = cheerio.load(data);
                                                console.log($(".pagination:first .page-item a").eq(-2).prop("outerHTML"));
                                                return parseInt($(".pagination:first .page-item a").eq(-2).html());
                                            }
                                            //eine seite mit der angegebenen seitennummer abrufen
                                            async function readPage(page) {
                                            console.log("F readPage "); 
                                              try {
                                                const response = await axios.get(baseUrl + page,{
                                                    headers: {
                                                        userAgent: userAgent
                                                    }
                                                });
                                            console.log("page "+page); 
                                            console.log("status "+response.status); 
                                             
                                                return response.data;
                                              } catch (error) {
                                                console.error('Fehler Abruf Seite: '+page, error);
                                                return 0;
                                              }
                                            
                                            }
                                            
                                            main();
                                            
                                            
                                            
                                            David G. 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            866
                                            Online

                                            32.0k
                                            Users

                                            80.4k
                                            Topics

                                            1.3m
                                            Posts

                                            3
                                            32
                                            936
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo