【问题标题】:Equivalent of Beautiful Soup's renderContents() method in lxml?相当于lxml中Beautiful Soup的renderContents()方法?
【发布时间】:2011-01-02 22:49:45
【问题描述】:

lxml 中是否有和 Beautiful Soup 的 tag.renderContents() 方法等效的方法?

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

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

【问题讨论】:

    标签: python xml rendering beautifulsoup lxml


    【解决方案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'
    >>>
    

    阿里。

    【讨论】:

      【解决方案2】:

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

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

      编辑

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

      【讨论】:

        猜你喜欢
        • 2016-12-02
        • 2012-06-12
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多