4

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

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

是否有我忽略的另一种方法(或实现此目的的替代方法)?

4

2 回答 2

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'
>>>

阿里。

于 2010-02-13T04:25:14.243 回答
0

一种骇人听闻的解决方案:

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

编辑

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

于 2010-01-14T04:59:54.970 回答