4 Stimmen

PHP XPATH eines HTML-Dokuments unter Auslassung aller Tags. Ich möchte sie behalten

Ich parsen ein HTML-Dokument mit XPATH und möchte alle inneren HTML-Tags behalten.

Das betreffende HTML ist eine ungeordnete Liste mit vielen Listenelementen.

BusinessContract

Ich parsiere das Dokument mit folgendem PHP-Code

$dom = new DOMDocument();
@$dom->loadHTML($output);
$this->xpath = new DOMXPath($dom);
$testDom = $this->xpath->evaluate("//ul[@id='adPoint1']");
$test = $testDom->item(0)->nodeValue;
echo htmlentities($test);

Aus irgendeinem Grund werden die HTML-Tags im Ausgabewert immer weggelassen. Ich nehme an, dass dies daran liegt, dass XPATH nicht dafür gedacht war, auf diese Weise verwendet zu werden. Gibt es dennoch eine Lösung dafür?

Ich möchte wirklich weiterhin XPATH verwenden, da ich es bereits zur Analyse anderer Bereiche der Seite (einfache a href-Elemente) ohne Probleme verwende.

EDIT: Ich weiß, dass es einen besseren Weg gibt, um die Daten zu erhalten, indem man durch die Unterelemente der UL iteriert. Es gibt einen komplizierteren Teil der Seite, den ich ebenfalls analysieren möchte (Block von JavaScript), aber ich versuche, ein leicht verständliches Beispiel zu geben.

Der tatsächliche Codeblock, den ich möchte, ist

document.write(rot_decode('<u7>Pbagnpg Qrgnvyf</u7><qy vq="pbagnpgQrgnvyf"><qg>Cu:</qg><qq>(58) 0078 8455</qq></qy>'));

Er hat das Problem, dass er alle abschließenden Tags auslässt, aber die öffnenden Tags beibehält. Ich vermute, dass XPATH versucht, die inneren Elemente zu parsen, anstatt sie einfach als Zeichenfolge zu behandeln.

Wenn ich versuche, das Skriptelement mit folgendem Code auszuwählen

$testDom = $this->xpath->evaluate("//div[@id='businessDetails']/script");
$test = $testDom->item(0)->nodeValue;
echo htmlentities($test);

wird mein Ausgabewert sein, der alle abschließenden Tags fehlt.

document.write(rot_decode('Pbagnpg QrgnvyfCu:(58) 0078 8455'));

2voto

uberweb Punkte 304

Ich habe festgestellt, dass XPATH nicht für das geeignet ist, was ich wollte, und benutze jetzt PHP Simple HTML DOM Parser, das viel besser für die Aufgabe geeignet ist.

Es behält die interne HTML-Formatierung problemlos bei.

foreach($this->simpleDom->find('script[language=javascript]') as $script) {
        echo htmlentities($script->innertext());
}

1voto

phunehehe Punkte 8328

Ja, du hast recht, DOM analysiert die untergeordneten Elemente (weil sie Elemente sind und keine Zeichenfolgen), und der richtige Weg, Daten von untergeordneten Elementen zu erhalten, besteht darin, durch alle von ihnen zu iterieren. Die Umsetzung wäre jedoch nicht kompliziert.
Sie möchten möglicherweise auch einen anderen XPath-Ausdruck ausprobieren, anstatt

//ul[@id='adPoint1']

versuchen Sie

//ul[@id='adPoint1']/li

das Elemente mit tatsächlichen Zeichenfolgenwerten auswählen würde.
Wenn das erwartete Ergebnis auch für beide ul und das Skript liefert, erhalten Sie möglicherweise mehr Antworten.

0voto

kervin Punkte 11462

Geben Sie den Knoten als optionalen Argument in den saveHTML()-Aufruf des Eigentümerdokumentobjekts an.

string DOMDocument::saveHTML ([ DOMNode $node = NULL ] )

See...

http://php.net/manual/en/domdocument.savehtml.php

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X