PHP XPATH документа HTML, пропускающий все теги. Я хочу оставить их

Я анализирую HTML-документ с XPATH, и я хочу сохранить все внутренние теги HTML.

Рассматриваемый HTML является неупорядоченным списком со многими элементами списка.

<ul id="adPoint1"><li>Business</li><li>Contract</li></ul>

Я анализирую документ, используя следующий код PHP

$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);

По какой-то причине в выводе всегда отсутствуют теги html. Я предполагаю, что это потому, что XPATH не был предназначен для использования таким образом, но есть ли вокруг этого?

Я действительно хотел бы продолжать использовать XPATH, поскольку я уже использую его для анализа других областей страницы (отдельных элементов href) без проблем.

РЕДАКТИРОВАТЬ: я знаю, что есть лучший способ получить данные путем перебора дочерних элементов UL. Есть более сложная часть страницы, которую я также хочу проанализировать (блок javascript), но я пытаюсь привести более простой для понимания пример.

Фактический блок кода, который я хочу это

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

Проблема в том, что он пропускает все закрывающие теги, но сохраняет открывающие теги. Я предполагаю, что это потому, что XPATH пытается проанализировать внутренние элементы, а не просто обрабатывать его как строку.

Если я попытаюсь выбрать элемент скрипта с

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

мой вывод будет, что вы видите, что отсутствуют все закрывающие теги.

document.write(rot_decode('<u7>Pbagnpg Qrgnvyf<qy vq="pbagnpgQrgnvyf"><qg>Cu:<qq>(58) 0078 8455'));
13.10.2009 06:14:46
3 ОТВЕТА

Да, вы правы, DOM анализирует дочерние элементы (потому что они являются элементами, а не строками), и правильный способ получить данные от дочерних элементов - это перебрать все из них. Реализация этого не будет сложной, хотя.
Вы также можете попробовать другое выражение XPath вместо

//ul[@id='adPoint1']

пытаться

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

который выберет элементы с фактическими строковыми значениями.
Если вы дадите ожидаемый результат (как для ul, так и для скрипта), возможно, вы получите больше ответов.

1
13.10.2009 06:39:45
phunehehe, да, вы правы, но я ищу решение, которое будет поддерживать теги внутри элемента. Я действительно пытаюсь получить строку, которая полностью содержит код javascript.
uberweb 13.10.2009 06:55:21
РЕШЕНИЕ

Я решил, что XPATH не подходит для того, что я хотел, и теперь использую PHP Simple HTML DOM Parser, который гораздо лучше подходит для этой задачи.

Он прекрасно поддерживает внутреннее форматирование HTML.

foreach($this->simpleDom->find('script[language=javascript]') as $script) {
        echo htmlentities($script->innertext());
}
2
13.10.2009 10:03:07

Передайте Node в качестве необязательного аргумента в вызове saveHTML () для объекта документа владельца.

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

Видеть...

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

0
4.04.2012 19:39:27