2013-05-02 60 views
0

我試圖從Folger Library Shakespeare TEI XML editions中提取對話框。對話框的一個典型的塊看起來是這樣的:如何使用python BeautifulSoup提取XML文本?

<sp xml:id="sp-0024" who="#HORATIO"> 
<speaker xml:id="spk-0024"> 
<w xml:id="w0003030">HORATIO</w> 
</speaker> 
<ab xml:id="ab-0024"> 
<join type="line" xml:id="ftln-0024" n="1.1.24" ana="#short" target="#w0003040 #c0003050 #w0003060 #c0003070 #w0003080 #c0003090 #w0003100 #p0003110"/> 
<w xml:id="w0003040" n="1.1.24">A</w> 
<c xml:id="c0003050" n="1.1.24"> </c> 
<w xml:id="w0003060" n="1.1.24">piece</w> 
<c xml:id="c0003070" n="1.1.24"> </c> 
<w xml:id="w0003080" n="1.1.24">of</w> 
<c xml:id="c0003090" n="1.1.24"> </c> 
<w xml:id="w0003100" n="1.1.24">him</w> 
<pc xml:id="p0003110" n="1.1.24">.</pc> 
</ab> 
</sp> 

我基本上要得到的輸出將是這樣的: [「霍雷肖」,「A片了。」] 但對於一個特定的所有對話字符。換句話說,我希望能夠輸入Folger Shakespeare TEI XML文件,並輸出像gertrude.txt和horatio.txt這樣的文件,每個文件都包含來自該特定字符的所有收集對話框。

我可以通過soup.find_all(who=u'#GERTRUDE')獲得特定演講者的所有對話/舞臺方向/等,但是我似乎無法對結果進行任何其他操作,例如進一步深入,獲取標籤之間的文本等,而不需要重新解析數據。這裏是發生了什麼:

>>> gertrude=soup.find_all(who=u'#GERTRUDE') 
>>> gertrude.w 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'ResultSet' object has no attribute 'w' 
>>> gertrude.get_text() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'ResultSet' object has no attribute 'get_text' 
+2

爲什麼不直接使用'lxml'? – 2013-05-02 21:07:03

+0

兩點:你如何使用這些數據?你可以發佈一個更大的樣本,這個樣本對於你的用例來說是一個有用的樣本大小。是的,我們可以幫助您提取數據,但有大量的解釋要做,所以知道如何使用它是很重要的。 – MattH 2013-05-02 21:37:26

+0

@MartijnPieters,我會看看,謝謝。我對解析XML一無所知,所以我只選擇了我聽到的第一件事。 – Jono 2013-05-03 01:57:33

回答

1

BeautifulSoup的.find_all()方法返回一個ResultSet對象,它是一種特殊的列表。您有0個或更多匹配,您需要循環搜索結果集或使用索引來獲取結果集中包含的各個元素:

for speaker in soup.find_all(who=u'#GERTRUDE'): 
相關問題