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

2024-09-30 04:30:05 发布

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

我想创建一个文本文件(下面repo中的txt文件),其中包含XML文件(repo中的XML文件)中的诗行,每行都包含在一个“l”标记中。问题是,其中三行有一个恼人的“里程碑”元素,它会导致我的代码(py文件)在写入新文件时忽略该行。有人能帮忙吗?你知道吗

具体来说,我想要的是:

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

…以同样的方式对待:

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

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

(我知道代码很混乱,有很多方法可以将代码晾干并更好地设置我的回购结构——只是尝试先把基本的想法记下来,然后我可以在以后再整理它。)

代码:

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>

Tags: 文件代码texttxttreesysunitrepo
1条回答
网友
1楼 · 发布于 2024-09-30 04:30:05

可以使用itertext()遍历所有文本字段,甚至是嵌套元素内的文本字段(或封闭元素的tail,如下所示):

for l in root.iter('l'):
    file.write(''.join(l.itertext()) + "\n")

相关问题 更多 >

    热门问题