lxml中等价于Beautiful Soup的renderContents()方法是什么?

4 投票
2 回答
926 浏览
提问于 2025-04-15 17:48

有没有类似于Beautiful Soup中tag.renderContents()方法的东西在lxml里?

我试过用element.text,但是这样不能显示子标签;我也试过''.join(etree.tostring(child) for child in element),但这样又不能显示子标签里的文本。我找到的最接近的办法是etree.tostring(element),但这样会显示element的开始和结束标签,我并不想要这些。

我是不是漏掉了什么方法(或者有没有其他的办法可以实现这个)?

2 个回答

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

补充说明

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

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

Ari.

撰写回答