Doppelt doppelte Anführungszeichen
pt004
- php
Hallo, ich quäle mich schon eine Weile mit dem Problem herum, dass ich von einer website das atrribut titel auslese und manchmal dort Zitate stehen, und zwar im Format ""Zitat"". Dadurch wird die Zeile leer ausgegeben. Ich habe folgendes versucht:
$data = file_get_contents('http://www.testseite.de');
$data = utf8_decode($data);
$doc = new DOMDocument();
$doc->loadHTML($data);
$xPath = new DOMXPath($doc);
$zaehler = 0;
foreach ($xPath->query('//h2/a') as $element)
{
$elementneu = str_replace("\"\"","\"",$element);
$hreft = $elementneu->getAttribute('href');
$class = $elementneu->getAttribute('class');
$title = $elementneu->getAttribute('title');
If ($zaehler <= 15)
{
echo "<li><a href=$hreft target='_blank'>$title</a></li>";
$zaehler++;
}
}
?>
</ul>
Bekomme jede Menge Warnings und einen schweren Fehler:
Warning: DOMDocument::loadHTML(): ID already defined in Entity, line: 3552 in /customers/6/d/c/nachrichtentisch.de/httpd.www/1index.php on line 203
Catchable fatal error: Object of class DOMDocument could not be converted to string in /customers/6/d/c/
Kann mir jemand helfen, welchen grundlegenden Fehler ich da mache? Danke
pt004
Hi,
ich könnte mir vorstellen, dass das Dokument welches du einzulesen versuchst invalides HTML beinhaltet und der Parser damit ein Problem hat.
Wenn " in einem Attributwert vorkommen sollten diese nämlich auch escaped sein.
also nicht so: <abbr title=""title"">foo</abbr>
sondern so: <abbr title=""title"">foo</abbr>
Als Beispiel-URL sollte man übrigens www.example.com oder www.example.org verwenden, die sind extra dafür frei gehalten.
~dave
Tach!
$data = file_get_contents('http://www.testseite.de');
$data = utf8_decode($data);
$doc = new DOMDocument();
$doc->loadHTML($data);
Da die DOM-Extension mit UTF-8 arbeitet, ist es keine gute Idee, ihr eine andere Kodierung vorzusetzen.
Bekomme jede Menge Warnings und einen schweren Fehler:
Warning: DOMDocument::loadHTML(): ID already defined in Entity, line: 3552 in /customers/6/d/c/nachrichtentisch.de/httpd.www/1index.php on line 203
Das sieht nach ungültigem HTML aus. Ein ID-Wert darf pro Dokument nur einmal vorkommen.
Catchable fatal error: Object of class DOMDocument could not be converted to string in /customers/6/d/c/
Du hast die Zeilennummer abgeschitten und auch ansonsten nicht gesagt, auf welche Zeile sich diese Meldung bezieht. Deswegen rate ich mal, dass es im nachfolgenden Code die str_replace-Zeile ist.
$xPath = new DOMXPath($doc);
foreach ($xPath->query('//h2/a') as $element)
{
$elementneu = str_replace("""",""",$element);
$hreft = $elementneu->getAttribute('href');
$element enthält ein Objekt der Klasse DOMNode. Diese Klasse hat laut Handbuch keine __toString()-Methode. Du kannst Objekte dieser Klasse also nicht wie einfache Strings verwenden. Selbst wenn das ginge - sprich: die __toString()-Methode vorhanden wäre - kannst du auf die gezeigte Weise keine Stringersetzung vornehmen. Im Stringkontext wird von __toString() lediglich ein String zurückgegeben und auch von str_replace() ist das Ergebnis ein String. Ein solcher ist kein Objekt und hat natürlich auch nicht die Methoden von DOMNode. - Das ist also auf alle Fälle nicht der Weg zum Ziel.
Zu deinem eigentlichen Problem mit den Anführungszeichen kann ich nichts sagen, weil mir nicht klar ist, wie konkret diese in dem zu verarbeitenden Dokument enthalten sind. Wenn der Validator das Dokument anmeckert, dann würde ich damit gar nicht weiterarbeiten wollen. Zwar kann DOMDocument::loadHTML() laut Handbuch mit nicht wohlgeformtem HTML umgehen, aber es ist schlicht unmöglich, aus allen Fehlern ein Ergebnis zu zaubern, das der ursprünglichen Intention entspricht. Das Parse-Ergebnis von loadHTML() kann also als Folge auch beliebig <del>falsch</del><ins>unerwartet</ins> sein.
dedlfix.
Vielen Dank für Deine Hilfe.
Da muss ich wohl noch einiges über den Unterschied zwischen Objekt und string nachlesen - ich bin in DOM nicht firm, das gebe ich zu. Der Originalcode der zu lesenden Seite heißt z. B. <a href="http://XYZ.de....../4672/25097552/d5dd69/Wirtschaft-und-Opposition-kritisch.html" tabindex="-1" class="linkOrange" title=""Das wird so nichts"">[mehr]</a>
Also title enthält ein Zitat und hat deshalb hier zwei Doppel-QUotes vorne und zwei hinten. Ich MUSS aber einen Weg finden, diese Seite auszulesen, mit dem Inhalt von href und dem von title - egal, ob sie HTML-valide ist oder nichtm, weil ich den Betreiber der Seite nicht beeinflussen kann (obwohl ich schon eine mail geschrieben habe.) Noch einen Tipp?
Gruß
pt004
Tach!
Der Originalcode der zu lesenden Seite heißt z. B.
<a href="http://XYZ.de....../4672/25097552/d5dd69/Wirtschaft-und-Opposition-kritisch.html" tabindex="-1" class="linkOrange" title=""Das wird so nichts"">[mehr]</a>
Das ist eindeutig falsch.
Also title enthält ein Zitat und hat deshalb hier zwei Doppel-QUotes vorne und zwei hinten.
Nee, das funktioniert so nicht, und keiner der großen 4 Browser zeigt in dem Fall einen Tooltip an. Ein String geht immer vom ersten Anführungszeichen bis zum nächsten gleichen Anführungszeichen. Wenn der Inhalt ebenfalls ein oder mehrere solcher Zeichen enthalten soll, müssen sie maskiert werden, sonst wird das erste als String-Ende erkannt und der Rest ist unvorhersagbar, meist jedoch ein Syntaxfehler.
Ich MUSS aber einen Weg finden, diese Seite auszulesen, mit dem Inhalt von href und dem von title - egal, ob sie HTML-valide ist oder nichtm, weil ich den Betreiber der Seite nicht beeinflussen kann (obwohl ich schon eine mail geschrieben habe.) Noch einen Tipp?
Ja. Wenn du den Seiteninhalt grad eben erst geholt hast, liegt er als String vor, und du kannst ihn mit Stringfunktionen bearbeiten. Nach der Korrektur bekommst du zwar noch die Warnungen wegen der mehrfachen Verwendung der ID-Werte, aber das title-Attribut sollte nun stimmen.
dedlfix.
Tach!
Der Originalcode der zu lesenden Seite heißt z. B.
<a href="http://XYZ.de....../4672/25097552/d5dd69/Wirtschaft-und-Opposition-kritisch.html" tabindex="-1" class="linkOrange" title=""Das wird so nichts"">[mehr]</a>
Das ist eindeutig falsch.
Also ich habe den Code oben aus dem Quelltext der Seite kopiert Dort steht wirklich title=""Das wird so nichts"">
Also, wenn ich Dich richtig verstehe, habe ich das Ganze als string in $data und könnte es so bewerkstelligen:
``<php>
$data = file_get_contents('http://www.heute.de');
$data = utf8_decode($data);
$doc = new DOMDocument();
$data = str_replace('""','"',$data);
$doc->loadHTML($data);
$xPath = new DOMXPath($doc);
$zaehler = 0;
foreach ($xPath->query('//h2/a') as $element)
{
$hreft = $element->getAttribute('href');
$class = $element->getAttribute('class');
$title = $element->getAttribute('title');
If ($zaehler <= 15)
{
echo "<li><a href=$hreft target='_blank'>$title</a></li>";
$zaehler++;
}
}
*/
?>
</ul>
Ich kann das Ganze leider gerade nicht testen, weil die entsprechende Seite zur Zeit gerade KEINE doppelte Double-Quotes hat (also keine Zitate als Schlagzeilen). Muss mir jetzt selbst erstmal eine Testseite basteln.
Danke für die Unterstützung.
pt004
Sorry für die falsche Code-Darstellung..
Hi,
Der Originalcode der zu lesenden Seite heißt z. B.
<a href="http://XYZ.de....../4672/25097552/d5dd69/Wirtschaft-und-Opposition-kritisch.html" tabindex="-1" class="linkOrange" title=""Das wird so nichts"">[mehr]</a>
Das ist eindeutig falsch.
Also ich habe den Code oben aus dem Quelltext der Seite kopiert Dort steht wirklich title=""Das wird so nichts"">
Nenne doch bitte mal die konkrete Seite. (Irgendwas auf heute.de vermutlich …)
MfG ChrisB
Hi,
Der Originalcode der zu lesenden Seite heißt z. B.
<a href="http://XYZ.de....../4672/25097552/d5dd69/Wirtschaft-und-Opposition-kritisch.html" tabindex="-1" class="linkOrange" title=""Das wird so nichts"">[mehr]</a>
Das ist eindeutig falsch.
Also ich habe den Code oben aus dem Quelltext der Seite kopiert Dort steht wirklich title=""Das wird so nichts"">
Nenne doch bitte mal die konkrete Seite. (Irgendwas auf heute.de vermutlich …)
MfG ChrisB
Ja, es geht um die heute.de-Startseite, die allerdings in diesem Moment keine Schlagzeilen mit Zitat hat. Heute den ganzen Tag über war es aber so und da wurde dann kein title gefunden, weil nach dem zweiten Doppel-Quote Schluss war mit einlesen.
Gruß
pt004
Hallo Chris,
[... ] Wirtschaft-und-Opposition-kritisch.html [...]
Nenne doch bitte mal die konkrete Seite. (Irgendwas auf heute.de vermutlich)
Zumindest sicher _keine_ Seite mit einer "cn" als Top-Level-Domain. ;-)
MfG
Hugo Egon Balder