簡體   English   中英

解析XML時獲取文本是否嵌套在額外元素中

[英]Getting text whether or not nested inside an extra element when parsing XML

我想創建一個文本文件(下面的回購中的txt文件),其中的詩歌行位於XML文件(回購中的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>

您可以使用itertext()遍歷所有文本字段,甚至包括嵌套元素內部的文本字段(或在封閉元素的tail ,如此處所示):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM