2013-09-25 8 views
3

У меня есть ответы на опросы, хранящиеся в xml, и, к сожалению, xml не является равномерно построенным. См. Ниже xml.Python xml итерация по вопросам и ответам

Я хотел бы перебрать divs, а затем вытащить все <b> элементов в качестве вопросов, но я не уверен, как справляться с ответами, поскольку они иногда включаются в подкатегорию <div>, а иногда и нет.

Я думал об использовании интертекста elementtree или прекрасного супа. Но BeautifulSoup возвращает все divs, включая внутренние, если я делаю soup.find_all('div'). tree.itertext() вид работ, но я не хочу иметь слишком много вложенных петель, если это возможно.

Любые предложения, как лучше всего справиться с этой ситуацией?

<html> 
<body> 
    <div> 
    <b>Question 1: What is your name?</b> 
    My name is Peter. 
    </div> 
    <div> 
    <b>Question 2: What is your native language?</b> 
    <div>Esperanto</div> 
    </div> 
</body> 
</html> 

ответ

4

перебрать дивы верхнего уровня, извлекать текст вопроса из b тега, извлечь ответ из следующего родственника или из текста следующего собрата следующего собрата:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(""" 
<html> 
<body> 
    <div> 
    <b>Question 1: What is your name?</b> 
    My name is Peter. 
    </div> 
    <div> 
    <b>Question 2: What is your native language?</b> 
    <div>Esperanto</div> 
    </div> 
</body> 
</html> 
""") 

for div in soup.find('body').findAll('div', recursive=False): 
    question = div.find('b') 
    print question.text 
    print question.nextSibling.strip() or question.nextSibling.nextSibling.text.strip() 

отпечатки:

Question 1: What is your name? 
My name is Peter. 
Question 2: What is your native language? 
Esperanto 
Смежные вопросы