2016-05-21 2 views
1

Я использую XPath для лома одной веб-страницы, но я неприятности с одной частью коды:Python Xpath получить значение только от корневого элемента

<div class="description"> 
    here's the page description 
    <span> some other text</span> 
    <span> another tag </span> 
</div> 

Я использую этот код получить значение из элемента:

description = tree.xpath('//div[@class="description"]/text()') 

я могу найти правильный DIV я ищу, но я только хочу, чтобы получить текст «вот описание страницы» не содержание от внутренних тегов пролетного

кто-нибудь знает, как я могу получить только текст в корневого узла, но не содержимого из дочерних узлов?

+0

что выражение xpath не должно содержать содержимого пролетов, а только содержимое текстовых узлов, которые являются прямыми дочерними элементами div: '[" \ n вот описание страницы \ n ", '\ n', '\ n']' – mata

ответ

2

Выражение, которое вы используете в настоящее время, будет фактически соответствовать только дочерним узлам текстового уровня верхнего уровня. Вы можете просто обернуть его в normalize-space(), чтобы очистить текст от лишних переводов строк и пробелов:

>>> from lxml.html import fromstring 
>>> data = """ 
... <div class="description"> 
... here's the page description 
... <span> some other text</span> 
... <span> another tag </span> 
... </div> 
... """ 
>>> root = fromstring(data) 
>>> root.xpath('normalize-space(//div[@class="description"]/text())') 
"here's the page description" 

Чтобы получить полный текст узла, включая дочерние узлы, использовать .text_content() метод:

node = tree.xpath('//div[@class="description"]')[0] 
print(node.text_content()) 
+0

Спасибо, но я думаю, что мой вопрос недостаточно ясен, я не хочу получать контент от дочерних узлов, только от корневого узла – Dennis

+0

@ Dennis my bad, но u должно быть хорошо, чтобы пойти с выражением u в настоящее время - он будет соответствовать только текстовым узлам верхнего уровня. – alecxe

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