2010-11-06 5 views
3

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

//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> 
+0

Хороший вопрос, +1. См. Мой ответ для объяснения. –

ответ

2

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

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'] 
+0

это замечательно, спасибо. – significance

2

Есть в любом случае использовать чистый 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).

Как @ Роберт-Rossney отметил в своем комментарии: tostring() метода LXML эквивалентен к другим средам outerXml собственности.

+0

спасибо, изменили vocab в вопросе ... lxml, похоже, не поддерживает innerXML() или outerXML() :( – significance

+0

@significance: Я также изменил свой ответ: Нет, XPath не представляет разметку узла в строка –

+0

Метод 'tostring()' lxml эквивалентен методу 'externalXml' других сред. –

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