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
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.526
446
83
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
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.526
446
83
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
768
71
28
38
Minden
sebastian1012.bplaced.net

Space Vampire

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

Space Vampire

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

Sempervivum

Senior HTML'ler
18 Oktober 2016
1.331
268
83
66
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;
 

Space Vampire

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