DOM zerschießt Umlaute

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

Space Vampire

Senior HTML'ler
19 Mai 2009
1.794
31
48
Claudia Colonia
www.space-vampire.de
#1
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?
 

scbawik

Senior HTML'ler
14 Juli 2011
2.497
437
83
#2
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:

Space Vampire

Senior HTML'ler
19 Mai 2009
1.794
31
48
Claudia Colonia
www.space-vampire.de
#4
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>
 

scbawik

Senior HTML'ler
14 Juli 2011
2.497
437
83
#6
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.
 

basti1012

Aktives Mitglied
26 November 2017
749
70
28
38
Minden
chat.sebastian1012.bplaced.net
#8
Ich habe dein Code aus post1und post4 bei mir in bplaced.net mal getestet und ich habe kein problem
http://sebastian1012.bplaced.net/ho...-december/umlaute-werden-falsch-angezeigt.php
vieleicht kann auch der Browser schuld sein oder so.Wäre mir neu ,aber irgendwo muß der Fehler ja sein.

Du solltest mal dein <html> am ende schliessen und nicht auf lassen. Wird denFehler wohl nicht beheben aber viel mir so auf
und dein <head> auch
 
#10
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?
 
#13
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.
 
18 Oktober 2016
1.210
255
83
65
#14
Du bist zwar dem Hinweis in meinem Link in #9 nachgegangen, aber Du hast es nicht richtig umgesetzt. Dies:
@$dom->loadHTMLFile(mb_convert_encoding('https://www.geocaching.com/track/details.aspx?id=7911901', 'HTML-ENTITIES', 'UTF-8'));
konvertiert nur die URL aber nicht das HTML, das da geladen wird.
Versuche es so:
PHP:
    $dom = new DomDocument;
    $dom->validateOnParse = true;
    $thehtml = file_get_contents('https://www.geocaching.com/track/details.aspx?id=7911901');
    @$dom->loadHTML(mb_convert_encoding($thehtml, 'HTML-ENTITIES', 'UTF-8'));
    $data = $dom->getElementById('ctl00_ContentBody_lbHeading');
    echo $data->textContent;