Выберите nodeValue, но исключите дочерние элементы - PullRequest
6 голосов
/ 08 февраля 2012

Допустим, у меня есть этот код:

<p dataname="description">
Hello this is a description. <a href="#">Click here for more.</a>
</p>

Как мне выбрать значение ноды p, но исключить a и его содержимое?

Мой текущий код:

$result = $xpath->query("//p[@dataname='description'][not(self::a)]");

Я выбираю его по $result->item(0)->nodeValue;

Ответы [ 2 ]

10 голосов
/ 08 февраля 2012

Простое добавление / text () к вашему запросу должно сработать

$result = $xpath->query("//p[@dataname='description'][not(self::a)]/text()");
2 голосов
/ 08 февраля 2012

Не уверен, поддерживает ли PHP XPath это, но этот XPath помогает мне в Scrapy (основанная на Python фреймворк):

$xpath->query('//p[@dataname='description']/text()[following-sibling::a]')

Если это не сработает, попробуйте решение Kristoffers, или вы также можете использовать решение регулярных выражений. Например:

$output = preg_replace("~<.*?>.*?<.*?>~msi", '', $result->item(0)->nodeValue);

Это удалит любой HTML-тег с любым содержимым, кроме текста, который не инкапсулирован HTML-тегами.

...