【问题标题】:lxml etree get all text before elementlxml etree 获取元素之前的所有文本
【发布时间】:2015-09-10 21:09:16
【问题描述】:

如何将所有文本 before 与元素 after 元素分开的 etree 中的元素分开?

from lxml import etree

tree = etree.fromstring('''
    <a>
        find
        <b>
            the
        </b>
        text
        <dd></dd>
        <c>
            before
        </c>
        <dd></dd>
        and after
    </a>
''')

我想要什么?在此示例中,&lt;dd&gt; 标记是分隔符,用于所有分隔符

for el in tree.findall('.//dd'):

我想要在它们之前和之后的所有文本:

[
    {
        el : <Element dd at 0xsomedistinctadress>,
        before : 'find the text',
        after : 'before and after'
    },
    {
        el : <Element dd at 0xsomeotherdistinctadress>,
        before : 'find the text before',
        after : 'and after'
    }
]

我的想法是在树中使用某种占位符,用它替换 &lt;dd&gt; 标记,然后在该占位符处剪切字符串,但我需要与实际元素的对应关系。

【问题讨论】:

    标签: python xml xml-parsing lxml elementtree


    【解决方案1】:

    可能有更简单的方法,但我会使用以下 XPath 表达式:

    preceding-sibling::*/text()|preceding::text()
    following-sibling::*/text()|following::text()
    

    示例实现(绝对违反 DRY 原则):

    def get_text_before(element):
        for item in element.xpath("preceding-sibling::*/text()|preceding-sibling::text()"):
            item = item.strip()
            if item:
                yield item
    
    def get_text_after(element):
        for item in element.xpath("following-sibling::*/text()|following-sibling::text()"):
            item = item.strip()
            if item:
                yield item
    
    for el in tree.findall('.//dd'):
        before = " ".join(get_text_before(el))
        after = " ".join(get_text_after(el))
    
        print {
            "el": el,
            "before": before,
            "after": after
        }
    

    打印:

    {'el': <Element dd at 0x10af81488>, 'after': 'before and after', 'before': 'find the text'}
    {'el': <Element dd at 0x10af81200>, 'after': 'and after', 'before': 'find the text before'}
    

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 2014-07-27
      • 2018-09-10
      • 2019-06-27
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多