Есть ли способ указать фиксированное (или переменное) количество элементов для lxml в Python - PullRequest
1 голос
/ 03 марта 2010

Должен быть более простой способ сделать это.Мне нужен текст из большого количества HTML-документов.В моих тестах самый надежный способ найти его - это найти определенное слово в text_content элементов div.Если я хочу осмотреть конкретный элемент выше того, у которого есть мой текст, я перечисляю свой список элементов div и использую индекс того, у которого есть мой текст, чтобы затем указать предыдущий, воздействуя на индекс.Но я уверен, что должен быть лучший путь.Я не могу понять это.

Если не ясно,

for pair in enumerate(list_of_elements):
    if 'the string' in pair[1].text_content():
        thelocation=pair[0]

the_other_text=list_of_elements[thelocation-9].text_content()     

или

theitem.getprevious().getprevious().getprevious().getprevious().getprevious().getprevious().getprevious().getprevious().getprevious().text_content()

Ответы [ 3 ]

3 голосов
/ 03 марта 2010

lxml поддерживает XPath :

from lxml import etree
root = etree.fromstring("...your xml...")

el, = root.xpath("//div[text() = 'the string']/preceding-sibling::*[9]")
1 голос
/ 03 марта 2010

Это делает трюк?

from itertools import islice
ancestor = islice(theitem.iterancestors(), 4) # To get the fourth ancestor

РЕДАКТИРОВАТЬ Я идиот, который не добивается цели. Вам нужно будет обернуть его во вспомогательную функцию следующим образом:

def nthparent(element, n):
    parent = islice(element.iterancestors(), n, n+1)
    return parent[0] if parent else None

ancestor = nthparent(theitem, 4) # to get the 4th parent
0 голосов
/ 03 марта 2010

Используйте что-то вроде simplehtmldom , а затем укажите индекс?

...