Эквивалент метода BeautifulConp renderContents () в lxml? - PullRequest
4 голосов
/ 08 января 2010

Есть ли в lxml эквивалент метода tag.renderContents() Beautiful Soup?

Я пытался использовать element.text, но он не отображает дочерние теги, а также ''.join(etree.tostring(child) for child in element), но этоне отображает дочерний текстСамое близкое, что я смог найти, это etree.tostring(element), но он отображает открывающие и закрывающие теги element, которые мне не нужны.

Есть ли другой способ, который я пропускаюальтернативный подход для достижения этой цели)?

Ответы [ 2 ]

1 голос
/ 13 февраля 2010

Вы в большинстве своем с оригинальной идеей. element.text дает вам первый текстовый дочерний элемент, а ваше понимание списка дает вам все остальное. Если вы объедините две строки вместе, вы получите то, что ищете:

>>> xmlstr = "<sec>header <p>para 0</p> text <p>para 1</p> footer</sec>"
>>> element = etree.fromstring(xmlstr)
>>>
>>> element.text + "".join(map (etree.tostring, element))
'header <p>para 0</p> text <p>para 1</p> footer'
>>>

Ари.

0 голосов
/ 14 января 2010

Одно хакерское решение:

from lxml import etree
def render_contents(element):
    """
    Surely there is a safe lxml built-in for this...
    """
    tagname = element.tag
    return re.sub('</%s>\s*$' % tagname, '',
                  re.sub(r'^<%s(\s+\w+=".*?")*?>' % tagname,
                         '', etree.tostring(element))).strip()

Редактировать

Неужели нет лучшего способа, чем этот?

...