使用python读取XML文本时的问题

2024-09-30 16:31:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试读取以下XML文件,该文件包含以下内容:

<tu creationdate="20100624T160543Z" creationid="SYSTEM" usagecount="0">
    <prop type="x-source-tags">1=A,2=B</prop>
    <prop type="x-target-tags">1=A,2=B</prop>
    <tuv xml:lang="EN">
      <seg>Modified <ut x="1"/>Denver<ut x="2"/> Score</seg>
    </tuv>
    <tuv xml:lang="DE">
      <seg>Modifizierter <ut x="1"/>Denver<ut x="2"/>-Score</seg>
    </tuv>
  </tu>

使用以下代码

tree = ET.parse(tmx)
root = tree.getroot()
seg = root.findall('.//seg')
for n in seg:
   print(n.text)

它给出了以下输出:

Modified
Modifizierter

我期待的是

Modified Denver Score
Modifizierter Denver -Score

有人能解释为什么只显示seg的一部分吗?你知道吗


Tags: 文件treelangtypetagsxmlmodifiedscore
2条回答

您可以使用tostring函数:

tree = ET.parse(tmx)
root = tree.getroot()
seg = root.findall('.//seg')
for n in seg:
   print(ET.tostring(n, method="text"))

在您的情况下,生成的字符串可能包含不必要的符号,因此您可以这样修改最后一行:

print(ET.tostring(n, method="text").strip())

您需要知道^{}属性,它是元素结束标记后面的文本。这里有很好的解释:http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/etree-view.html。你知道吗

“Denver”是第一个<ut>元素的tail,“Score”是第二个<ut>元素的tail。这些字符串不是<seg>元素的text的一部分。你知道吗

除了kgbplus提供的解决方案(它同时适用于ElementTree和lxml),对于lxml,您还可以使用以下方法获得所需的输出:

  1. ^{}

    for n in seg:
        print("".join(n.xpath("text()")))
    
  2. ^{}

    for n in seg:
        print("".join(n.itertext()))
    

相关问题 更多 >