Как получить полное содержимое узла, используя xpath & lxml? - PullRequest
4 голосов
/ 06 ноября 2010

Я использую функцию lxml xpath для извлечения частей веб-страницы.Я пытаюсь получить содержимое тега <font>, который включает собственные теги html.Если я использую

//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]

, я получаю правильное количество узлов, но они возвращаются как объекты lxml (<Element font at 0x101fe5eb0>).

Если я использую

//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/text()

Я получаю именно то, что хочу, за исключением того, что я не получаю никакого кода HTML, который содержится в узлах <font>.

Если я использую

//td[@valign="top"]/p[1]/font[@face="verdana" and @color="#ffffff" and @size="2"]/node()

, если получаюсмесь текста и элементов lxml!(например, something something <Element a at 0x102ac2140> something)

В любом случае можно ли использовать чистый запрос XPath для получения содержимого узлов <font> или даже заставить lxml вернуть строку содержимого из метода .xpath()вместо lxml объекта?

Обратите внимание, что я возвращаю список многих узлов из запроса XPath, поэтому решение должно поддерживать это.

, просто чтобы уточнить ... я хочувернуть something something <a href="url">inside</a> something из чего-то вроде ...

<font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font>

Ответы [ 2 ]

2 голосов
/ 06 ноября 2010

Я не уверен, что понимаю - это близко к тому, что вы ищете?

import lxml.etree as le
import cStringIO
content='''\
<font face="verdana" color="#ffffff" size="2"><a href="url">inside</a> something</font>
'''
doc=le.parse(cStringIO.StringIO(content))

xpath='//font[@face="verdana" and @color="#ffffff" and @size="2"]/child::*'
x=doc.xpath(xpath)
print(map(le.tostring,x))
# ['<a href="url">inside</a> something']
2 голосов
/ 06 ноября 2010

Есть ли в любом случае использовать чистый XPath запрос, чтобы получить содержимое <font> узлов, или даже заставить lxml вернуть строку содержимого из метода .xpath(), скорее чем объект lxml?

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

просто чтобы уточнить ... я хочу вернуться что-то <a href="url">inside</a> something из что-то вроде ...

<font face="verdana" color="#ffffff" size="2"><a

href = "url"> внутри чего-то

Краткий ответ : Нет.

XPath не работает с «тегами», но с узлами

Выбранные узлы представлены как экземпляры определенных объектов на языке, на котором размещается XPath.

Если вам требуется строковое представление разметки конкретного узла, такие объекты обычно поддерживают свойство outerXML - проверьте документацию по языку хостинга (в данном случае lxml).

Как указал @ Robert-Rossney в своем комментарии: * lxml tostring() метод эквивалентен outerXml свойству других сред .

...