在解析XML时获取文本是否嵌套在额外元素中

时间:2017-11-22 23:10:22

标签: python xml lxml

我想创建一个文本文件(下面的repo中的txt文件),其中包含XML文件(repo中的xml文件)中的诗歌行,每行包含在" l&#34中;标签。问题是,其中三条线路有一个令人烦恼的里程碑"导致我的代码(py文件)在写入新文件时忽略该行的元素。有人可以帮忙吗?

具体来说,我想要类似的东西:

<l><milestone ed="P" unit="Para"/>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>

......以与以下相同的方式对待:

<l>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>

输入文件取自https://github.com/DLibatique/texts/tree/master/iliad

(我知道代码很乱,并且有很多方法可以干掉它并更好地设置我的repo结构 - 只是先试着先把基本的想法放下来然后再把它弄清楚。)

代码:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import xml.etree.ElementTree as ET
tree = ET.parse('iliad_1_1-32.xml')
root = tree.getroot()

file = open('iliad_1_1-32.txt','w')
for l in root.iter('l'):
    file.write(str(l.text) + "\n")
file.close()

XML:

<?xml version="1.0" encoding="utf-8"?>
<text>
  <body>
    <div1 type="Book" n="1" org="uniform" sample="complete">
      <milestone ed="p" n="1" unit="card"/>
      <l><milestone ed="P" unit="para"/>μῆνιν ἄειδε θεὰ Πηληϊάδεω Ἀχιλῆος</l>
      <l>οὐλομένην, ἣ μυρί᾽ Ἀχαιοῖς ἄλγε᾽ ἔθηκε,</l>
      <l>πολλὰς δ᾽ ἰφθίμους ψυχὰς Ἄϊδι προΐαψεν</l>
      <l>ἡρώων, αὐτοὺς δὲ ἑλώρια τεῦχε κύνεσσιν</l>
      <l n="5">οἰωνοῖσί τε πᾶσι, Διὸς δ᾽ ἐτελείετο βουλή,</l>
      <l>ἐξ οὗ δὴ τὰ πρῶτα διαστήτην ἐρίσαντε</l>
      <l>Ἀτρεΐδης τε ἄναξ ἀνδρῶν καὶ δῖος Ἀχιλλεύς.</l>
      <l><milestone ed="P" unit="Para"/>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>
      <l>Λητοῦς καὶ Διὸς υἱός: ὃ γὰρ βασιλῆϊ χολωθεὶς</l>
      <l n="10">νοῦσον ἀνὰ στρατὸν ὄρσε κακήν, ὀλέκοντο δὲ λαοί,</l>
      <l>οὕνεκα τὸν Χρύσην ἠτίμασεν ἀρητῆρα</l>
      <l>Ἀτρεΐδης: ὃ γὰρ ἦλθε θοὰς ἐπὶ νῆας Ἀχαιῶν</l>
      <l>λυσόμενός τε θύγατρα φέρων τ᾽ ἀπερείσι᾽ ἄποινα,</l>
      <l>στέμματ᾽ ἔχων ἐν χερσὶν ἑκηβόλου Ἀπόλλωνος</l>
      <l n="15">χρυσέῳ ἀνὰ σκήπτρῳ, καὶ λίσσετο πάντας Ἀχαιούς,</l>
      <l>Ἀτρεΐδα δὲ μάλιστα δύω, κοσμήτορε λαῶν:</l>
      <l>Ἀτρεΐδαι τε καὶ ἄλλοι ἐϋκνήμιδες Ἀχαιοί,</l>
      <l>ὑμῖν μὲν θεοὶ δοῖεν Ὀλύμπια δώματ᾽ ἔχοντες</l>
      <l>ἐκπέρσαι Πριάμοιο πόλιν, εὖ δ᾽ οἴκαδ᾽ ἱκέσθαι:</l>
      <l n="20">παῖδα δ᾽ ἐμοὶ λύσαιτε φίλην, τὰ δ᾽ ἄποινα δέχεσθαι,</l>
      <l>ἁζόμενοι Διὸς υἱὸν ἑκηβόλον Ἀπόλλωνα.</l>
      <l><milestone ed="P" unit="para"/>ἔνθ᾽ ἄλλοι μὲν πάντες ἐπευφήμησαν Ἀχαιοὶ</l>
      <l>ἀλλ᾽ οὐκ Ἀτρεΐδῃ Ἀγαμέμνονι ἥνδανε θυμῷ,</l>
      <l n="25">ἀλλὰ κακῶς ἀφίει, κρατερὸν δ᾽ ἐπὶ μῦθον ἔτελλε:</l>
      <l>μή σε γέρον κοίλῃσιν ἐγὼ παρὰ νηυσὶ κιχείω</l>
      <l>ἢ νῦν δηθύνοντ᾽ ἢ ὕστερον αὖτις ἰόντα,</l>
      <l>μή νύ τοι οὐ χραίσμῃ σκῆπτρον καὶ στέμμα θεοῖο:</l>
      <l>τὴν δ᾽ ἐγὼ οὐ λύσω: πρίν μιν καὶ γῆρας ἔπεισιν</l>
      <l n="30">ἡμετέρῳ ἐνὶ οἴκῳ ἐν Ἄργεϊ τηλόθι πάτρης</l>
      <l>ἱστὸν ἐποιχομένην καὶ ἐμὸν λέχος ἀντιόωσαν:</l>
      <l>ἀλλ᾽ ἴθι μή μ᾽ ἐρέθιζε σαώτερος ὥς κε νέηαι.</l>
    </div1>
  </body>
</text>

1 个答案:

答案 0 :(得分:0)

您可以使用tail迭代所有文本字段,甚至是嵌套元素内部的文本字段(或在封闭元素的for l in root.iter('l'): file.write(''.join(l.itertext()) + "\n") 上),如此处所示:

...    a       b           c        d        e        f
2740   String  2017-11-20  1020.26  1018.38  1022.61  1017.50
2741   String  2017-11-21  1023.31  1034.49  1035.11  1022.66
2742   String  2017-11-22  1035.00  1035.96  1039.71  1031.43