解析时获取是否嵌套在额外元素中的文本 XML
Getting text whether or not nested inside an extra element when parsing XML
我想创建一个文本文件(下面 repo 中的 txt 文件),每行诗行都在 XML 文件(repo 中的 xml 文件)中包含在 "l" 标签中。问题是,其中三行有一个恼人的 "milestone" 元素,导致我的代码(py 文件)在写入新文件时忽略该行。有人可以帮忙吗?
具体来说,我想要这样的东西:
<l><milestone ed="P" unit="Para"/>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>
...将以与以下相同的方式对待:
<l>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>
输入文件取自https://github.com/DLibatique/texts/tree/master/iliad
(我知道代码很乱,有很多方法可以对其进行 DRY 并更好地设置我的 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>
您可以使用 itertext()
遍历所有文本字段,甚至是嵌套元素内的文本字段(或在封闭元素的 tail
上,如此处):
for l in root.iter('l'):
file.write(''.join(l.itertext()) + "\n")
我想创建一个文本文件(下面 repo 中的 txt 文件),每行诗行都在 XML 文件(repo 中的 xml 文件)中包含在 "l" 标签中。问题是,其中三行有一个恼人的 "milestone" 元素,导致我的代码(py 文件)在写入新文件时忽略该行。有人可以帮忙吗?
具体来说,我想要这样的东西:
<l><milestone ed="P" unit="Para"/>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>
...将以与以下相同的方式对待:
<l>τίς τ᾽ ἄρ σφωε θεῶν ἔριδι ξυνέηκε μάχεσθαι;</l>
输入文件取自https://github.com/DLibatique/texts/tree/master/iliad
(我知道代码很乱,有很多方法可以对其进行 DRY 并更好地设置我的 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>
您可以使用 itertext()
遍历所有文本字段,甚至是嵌套元素内的文本字段(或在封闭元素的 tail
上,如此处):
for l in root.iter('l'):
file.write(''.join(l.itertext()) + "\n")