使用python在XML中读取文本的问题

时间:2017-09-14 14:18:24

标签: python xml parsing lxml

我正在尝试阅读以下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?

2 个答案:

答案 0 :(得分:1)

您可以使用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())

答案 1 :(得分:1)

您需要了解tail属性,该属性是元素结束标记后面的文本。这里解释得很好:http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/etree-view.html

&#34;丹佛&#34;是第一个tail元素的<ut>和&#34;得分&#34;是第二个tail元素的<ut>。这些字符串不属于text元素的<seg>

除了kgbplus(适用于ElementTree和lxml)提供的解决方案之外,使用lxml还可以使用以下方法获取所需的输出:

  1. xpath()

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

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