Проблема Python lxml XPath

Я пытаюсь распечатать/сохранить HTML-код определенного элемента с веб-страницы.
Я получил XPath запрошенного элемента из firebug.

Все, что я хочу, это сохранить этот элемент в файл. Кажется, мне это не удалось.
(пробовал XPath с /text() в конце и без него)

Буду признателен за любую помощь или прошлый опыт.
10x, Дэвид

import urllib2,StringIO
from lxml import etree

url='http://www.tutiempo.net/en/Climate/Londres_Heathrow_Airport/12-2009/37720.htm'
seite = urllib2.urlopen(url)
html = seite.read()
seite.close()
parser = etree.HTMLParser()
tree = etree.parse(StringIO.StringIO(html), parser)
xpath = "/html/body/table/tbody/tr/td[2]/div/table/tbody/tr[6]/td/table/tbody/tr/td[3]/table/tbody/tr[3]/td/table/tbody/tr/td/table/tbody/tr/td/table/tbody/text()"
elem = tree.xpath(xpath)


print elem[0].strip().encode("utf-8")

person Trevor    schedule 16.03.2011    source источник
comment
Это часто задаваемый вопрос: браузеры добавляют в DOM обязательные (X)HTML-элементы (т. е. head и tbody). Не доверяйте Firebug. Загляните в исходный документ.   -  person    schedule 17.03.2011
comment
возможный дубликат Проблема с lxml xpath для извлечения таблицы html   -  person Yatharth Agarwal    schedule 11.01.2015


Ответы (2)


Ваш XPath явно слишком длинный, почему бы вам не попробовать более короткие и посмотреть, совпадают ли они. Одной из проблем может быть «tbody», который автоматически создается браузерами в DOM, но HTML-разметка обычно его не содержит.

Вот пример использования результатов XPath:

>>> from lxml import etree
>>> from StringIO import StringIO
>>> doc = etree.parse(StringIO("<html><body>a<something/>b</body></root>"), etree.HTMLParser())
>>> doc.xpath("/html/body/text()")
['a', 'b']

Таким образом, вы можете просто "".join(...) соединить все текстовые части вместе, если это необходимо.

person AndiDog    schedule 17.03.2011
comment
@ Дело не в том, что это слишком долго. Тем не менее, ваше замечание было абсолютно правильным. Не подумал бы об этом и через миллион лет. Большое спасибо! - person Trevor; 17.03.2011

Не уверен, что полностью следую тому, чего вы пытаетесь достичь, но в конечном итоге я думаю, что вы ищете:

print etree.tostring(elem[0])
person Jim    schedule 17.03.2011