PHP XPATH документа HTML, пропускающий все теги. Я хочу оставить их - PullRequest
4 голосов
/ 13 октября 2009

Я анализирую 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 пытается анализировать внутренние элементы, а не просто обрабатывает его как строку.

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

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

Ответы [ 3 ]

2 голосов
/ 13 октября 2009

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

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

foreach($this->simpleDom->find('script[language=javascript]') as $script) {
        echo htmlentities($script->innertext());
}
1 голос
/ 13 октября 2009

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

//ul[@id='adPoint1']

1007 * попробовать *

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

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

0 голосов
/ 04 апреля 2012

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

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

См ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...