NEWS
[gelöst] Funktion gibt kein result aus und JS erweitern
-
@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.
-
Also die Zeile
const result = JSON.stringify(alleErgebnisse, null, 2);
zu
result = JSON.stringify(alleErgebnisse, null, 2);
abändern?
-
Das wäre jetzt mein Quick Hack, wenn es sicher auch schönere Lösungen gibt.
-
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. -
@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 -
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-1Was 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.txtUnd 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
-
@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 gibtconst 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();
-
Danke, morgen Abend kann ich es bei mir testen.
Den ganzen Tag auf Messe. -
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.
-
@david-g
Mit blockly kenne ich mich nicht so aus.
Am besten du schreibst das in ein JavaScript scriptIn einen datenpunkt Schreiben kannst du es mit setState in Zeile 19
Dein blockly trigger dann am besten auf Änderung dieses datenpunktes -
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: []
-
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();
-
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: []
-
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.mp4mit 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
-
-
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();
-
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. -
@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. -
Anbei das ganze Log mit Quellcode:
log.txtHier 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>
-
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();