相当于lxml中Beautiful Soup的renderContents()方法?

时间:2010-01-08 14:45:04

标签: python xml rendering beautifulsoup lxml

在lxml中是否有相当于Beautiful Soup的tag.renderContents()方法?

我已尝试使用element.text,但这不会呈现子标记,也不会呈现''.join(etree.tostring(child) for child in element),但这不会呈现子文本。我能找到的最接近的是etree.tostring(element),但这会产生element的开始和结束标记,这是我不想要的。

我还有另一种方法可以忽略(或另一种方法来实现这一目标)吗?

2 个答案:

答案 0 :(得分:1)

你最初的想法就是你最初的想法。 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'
>>>

阿里。

答案 1 :(得分:0)

一个hackish解决方案:

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()

修改

真的,没有比这更好的方法吗?