【问题标题】:How to parse .trs XML file for text between self-closing tags?如何解析 .trs XML 文件以获取自闭合标签之间的文本?
【发布时间】:2020-05-16 06:51:43
【问题描述】:

我有这样的文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Trans SYSTEM "trans-14.dtd">
<Trans scribe="MSPLAB" audio_filename="Combine001" version="5" version_date="110525">
<Episode>
<Section type="report" startTime="0" endTime="2613.577">
<Turn startTime="0" endTime="308.0620625">
<Sync time="0"/>

<Event desc="music" type="noise" extent="instantaneous"/>

<Sync time="2.746"/>
TARGET_TEXT1
<Sync time="5.982"/>
TARGET_TEXT2

</Turn>
</Section>
</Episode>
</Trans>

这是否被认为是格式良好的 xml 文件?我正在尝试在 Python 中提取 TARGET_TEXT1TARGET_TEXT2,但我不明白这些内容属于自闭标签之间的位置。我看到了另一个帖子here,但它是用 Java 完成的。

【问题讨论】:

    标签: python xml parsing


    【解决方案1】:

    使用来自ElementTreeitertext

    import xml.etree.ElementTree as ET
    
    tree = ET.parse('test.xml')
    root = tree.getroot()
    
    data = [text.strip() for node in root.findall('.//Turn') for text in node.itertext() if text.strip()]
    print(data)
    

    输出:

    ['TARGET_TEXT1', 'TARGET_TEXT2']
    

    更新: 如果你想要字典作为输出试试这个:

    data = {float(x.attrib['time']): x.tail.strip() for node in root.findall('.//Turn') for x in node if x.tail.strip()}
    #{2.746: 'TARGET_TEXT1', 5.982: 'TARGET_TEXT2'}
    

    【讨论】:

    • 是否可以将TARGET_TEXTSync 标签中的属性time 的值相关联?例如输出带有{2.746: 'TARGET_TEXT1', 5.982: 'TARGET_TEXT2'} 的字典
    【解决方案2】:

    另一种选择,通过parsel使用xpath:

    从解析导入选择器

    #xml is wrapped into a variable called data
    selector = Selector(text=data, type="xml")
    selector.xpath(".//Turn/text()").re("\w+")
    ['TARGET_TEXT1', 'TARGET_TEXT2']
    

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-28
      • 2011-10-28
      • 2018-01-24
      相关资源
      最近更新 更多