• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

DOM zerschießt Umlaute

Space Vampire

Senior HTML'ler
Ich versuche den Textinhalt bestimmter Elemente auf einer externen Website auszulesen. Das folgende Script macht das eigentlich auch präzise. Leider zerschießt es die Umlaute. Die URL und die ID im Beispiel sind valide. Können also zur Anschauung verwendet werden.

PHP:
$dom = new DomDocument;
$dom->validateOnParse = true;
@$dom->loadHTMLFile('https://www.geocaching.com/track/details.aspx?id=7911901');
$data = $dom->getElementById('ctl00_ContentBody_lbHeading');
echo $data->textContent;

Die ausgabe ergibt
*RACER-TB* Tröpfli KLORINDE

Ich habs auch schon über die DOM Arguments versucht. Kommt genau das Gleiche bei raus.
Nun wäre es eine Lösung, das vor der Ausgabe zeichenspezifisch zu bereinigen. Allerdings habe ich keine Ahnung, ob sich das Problem auf Umlaute beschrenkt.
Kann man das Problem vielleicht so anfassen, dass es gar nicht erst entsteht?
 
Werbung:
Ich versuche den Textinhalt bestimmter Elemente auf einer externen Website auszulesen. Das folgende Script macht das eigentlich auch präzise. Leider zerschießt es die Umlaute. Die URL und die ID im Beispiel sind valide. Können also zur Anschauung verwendet werden.

PHP:
$dom = new DomDocument;
$dom->validateOnParse = true;
@$dom->loadHTMLFile('https://www.geocaching.com/track/details.aspx?id=7911901');
$data = $dom->getElementById('ctl00_ContentBody_lbHeading');
echo $data->textContent;

Die ausgabe ergibt
*RACER-TB* Tröpfli KLORINDE

Ich habs auch schon über die DOM Arguments versucht. Kommt genau das Gleiche bei raus.
Nun wäre es eine Lösung, das vor der Ausgabe zeichenspezifisch zu bereinigen. Allerdings habe ich keine Ahnung, ob sich das Problem auf Umlaute beschrenkt.
Kann man das Problem vielleicht so anfassen, dass es gar nicht erst entsteht?

Am Code selbst gibt es nichts auszusetzen.
Liegt also am File Encoding oder Content-Type Header.
(Also an deinem Charset, nicht dem von geocaching)
 
Zuletzt bearbeitet:
Dachte ich auch erst. Die Datei ist UTF 8 kodiert und ich hab das echo auch schon mit einem HTML-Gerüst mit UTF 8 Charset umgeben. Fehlanzeige.
 
Werbung:
So sieht der gesamte Code der Testseite aus.
HTML:
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<body>
<p>
<?php
$dom = new DomDocument;
$dom->validateOnParse = true;
@$dom->loadHTMLFile('https://www.geocaching.com/track/details.aspx?id=7911901');
$data = $dom->getElementById('ctl00_ContentBody_lbHeading');
echo $data->textContent; 
?>
</p>
</body>
<html>
 
Dachte ich auch erst. Die Datei ist UTF 8 kodiert und ich hab das echo auch schon mit einem HTML-Gerüst mit UTF 8 Charset umgeben. Fehlanzeige.

Wie @Sempervivum bestätigt - es funktioniert einwandfrei.

So sieht der gesamte Code der Testseite aus.
HTML:
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<body>
<p>
<?php
$dom = new DomDocument;
$dom->validateOnParse = true;
@$dom->loadHTMLFile('https://www.geocaching.com/track/details.aspx?id=7911901');
$data = $dom->getElementById('ctl00_ContentBody_lbHeading');
echo $data->textContent;
?>
</p>
</body>
<html>

In HTML5 wird das charset per

Code:
<meta charset="UTF-8">

definiert. Das wird aber nicht das Problem sein.
Es gibt noch den HTTP-Header Content-Type - welcher höher wiegt soweit ich weiß.
Hatte auch schon einmal mit einem Server zu tun, der ein falsches Charset verschickte.
Herauszufinden zB mit cURL:

Code:
curl -I <adresse>

Ergibt dann zB:

Code:
HTTP/2 200 
date: Tue, 04 Dec 2018 23:54:34 GMT
content-type: text/html; charset=UTF-8

Oder natürlich auch über die Browserkonsole oder anderen Tools.
 
Werbung:
Das Problem hat es zwar nicht behoben, aber da sieht man mal, wie betriebsblind man sein kann. Die offenen Tags sind mir gar nicht aufgefallen.
Ich hab jetzt alle Anregungen beherzigt und ausprobiert. Ohne Erfolg. dass das auf deinem bplaced funktioniert, gibt mir jetzt irgendwie den Rest.
Code sieht nun so aus.
PHP:
<!DOCTYPE HTML>
<html>
<head>
<title>Test</title>
<meta charset="UTF-8">
</head>
<body>
<p>
<?php
$dom = new DomDocument;
$dom->validateOnParse = true;
@$dom->loadHTMLFile(mb_convert_encoding('https://www.geocaching.com/track/details.aspx?id=7911901', 'HTML-ENTITIES', 'UTF-8'));
$data = $dom->getElementById('ctl00_ContentBody_lbHeading');
echo $data->textContent;
?>
</p>
</body>
</html>
Keine Veränderung.
Kann es vielleicht an der PHP-Version liegen?
 
Hab jetzt PHP 5.6, 7.1 und 7.2 durch. daran liegt's auch nicht. Um die Browser-Frage zu beantworten: Chrome und FF alles gleich.
 
Werbung:
Habs mit und ohne BOM versucht.
Bplaced ist aus der Rechnung inzwischen raus, da Lesen von externem Content nur mit pro unterstützt wird.

In Xampp gehts nicht, weil da irgendein Socket nicht freigeschaltet ist.
Bleibt die Frage, warum es auf meinem privaten Server nicht sauber ausgegeben wird.
Mit echo file_get_contents(gesamte Website) kriege ich ne saubere Ausgabe.
Ich verstehe es einfach nicht.

Ich hab jetzt mal PHP-Info mit eingebunden. Vielleicht sieht ja da jemand von euch die Quelle des Fehlers.
 
Super! Vielen dank für den Tipp und die Aufklärung. Jetzt passt es. :D
Mir ist zwar immer noch schleierhaft, warum die einfache Form bei anderen funktioniert aber nicht auf meinem Server, aber das werde ich wohl nie erfahren. Was zählt, ist das Ergebnis. Vielen dank an alle, für die Hilfe.
 
Werbung:
Zurück
Oben