2013-05-02 4 views
0

Я пытаюсь извлечь диалог из Folger Library Shakespeare TEI XML editions. Типичный кусок диалога выглядит следующим образом:Как извлечь XML-текст с помощью python BeautifulSoup?

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

Я в принципе хочу, чтобы получить результат, который выглядит следующим образом: [ «Горацио», 'Кусок его.] , но и для всего диалога конкретных персонаж. Другими словами, я хочу иметь возможность вводить XML-файл Folder Shakespeare TEI и выводить файлы, такие как gertrude.txt и horatio.txt, каждый из которых содержит весь собранный диалог от этого конкретного символа.

Я могу получить все диалоговое/сценическое направление/etc конкретного динамика с 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' напрямую? –

+0

Два момента: как вы пытаетесь использовать данные? Можете ли вы опубликовать более крупный образец, который будет полезным размером выборки для вашего тестирования против вашего прецедента. Да, мы можем помочь вам извлечь данные, но есть необходимость в интерпретации, поэтому важно знать, как вы хотите ее использовать. – MattH

+0

@MartijnPieters, я рассмотрю это, спасибо. Я ничего не знаю о разборе XML, поэтому я просто выбрал первое, что я слышал. – Jono

ответ

1

BeautifulSoup в .find_all() возвращает ResultSet объект, который представляет собой специализированный вид списка. У вас есть 0 или более совпадений, и вам нужно либо перебрать этот набор результатов, либо использовать индексирование для получения отдельных элементов, содержащихся в результирующем наборе:

for speaker in soup.find_all(who=u'#GERTRUDE'): 
Смежные вопросы