如何使用python BeautifulSoup提取XML文本?

时间:2013-05-02 21:05:32

标签: python xml beautifulsoup

我正在尝试从Folger Library Shakespeare TEI XML editions中提取对话框。一段典型的对话框如下所示:

<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>

我基本上想要获得如下所示的输出:     ['Horatio','他的一块。'] 但对于特定角色的所有对话。换句话说,我希望能够输入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'

1 个答案:

答案 0 :(得分:1)

BeautifulSoup的.find_all()方法返回一个ResultSet对象,这是一种特殊的列表。您有0个或更多匹配项,并且需要循环该结果集或使用索引来获取结果集中包含的各个元素:

for speaker in soup.find_all(who=u'#GERTRUDE'):