2012-02-08 3 views
6

Допустим, у меня есть этот код:Выберите nodeValue но исключающие дочерние элементы

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

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

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

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

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

ответ

10

Просто добавьте/текст() в запросе должен сделать трюк

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

Может у PLS объяснить, почему это так? – Michelle

+2

Без/text() вы выбираете весь узел, включая его дочерние элементы. Узлы элементов не имеют собственного текста, вместо этого текст хранится в дочернем узле, называемом текстовым узлом. nodeValue используется для получения текстового значения узла. Вызов nodeValue на узле с дочерними дочерними узлами get get и объединяет их. С помощью/text() вы захватываете только первый дочерний узел текста типа и, следовательно, получаете только текст этого текстового узла – Kristofer

2

Неуверенный, если XPath РНР поддерживает это, но это XPath делает трюк для меня в Scrapy (Python на основе выскабливание рамки):

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

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

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

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

Смежные вопросы