2015-03-21 4 views
1

У меня есть XML-то вроде этогоСинтаксический XML с использованием BeautifulSoup или minidom

#filename sample.xml 
<tag> 
<tag1> 
<tag2 property="something"/> 
<tag2 property="something1"/> 
<tag2 property="something2">value</tag2> 
<tag2 property="something3"> 
<tag3> 
<tag4 data="data1"/> 
<tag4 data="data2"/> 
</tag3> 
</tag2> 
</tag1> 
</tag> 

Я хочу, чтобы извлечь 'data1' и 'data2'. Я пытаюсь что-то вроде этого:

f=open('sample.xml') 
fdata=f.read() 
xmldata=BeautifulSoup(fadata) 
print (xmldata.tag.tag1.tag2.tag3.tag4["data"]) 

Но это бросает ошибку:

AttributeError: 'NoneType' object has no attribute 'tag4' 
+1

BeautifulStoneSoup относится к ** устаревшим ** BeautifulSoup 3; вы должны использовать BeautifulSoup4/'bs4'. И BS3 ** не может корректно анализировать XML, тогда как BS4 может. –

+0

@ AnthiHaapala с помощью bs4. Также как можно достичь этого с помощью xml.dom.minidom? – fhulprogrammer

ответ

3

print функция терпит неудачу из-за нескольких tag2 с. Решением было бы получить все теги, используя .findAll('tag2').

Вот рабочий пример:

#! /usr/bin/python 

from bs4 import BeautifulSoup 
f=open('sample.xml') 
fdata=f.read() 
xmldata=BeautifulSoup(fdata) 

alltags2 = xmldata.tag.tag1.findAll('tag2') 

for tag2 in alltags2: 
    alltags3 = tag2.findAll('tag3') 
    for tag3 in alltags3: 
     alltags4 = tag3.findAll('tag4') 
     for tag4 in alltags4: 
      print "The data I got was :\"%s\"" % (tag4["data"]) 

С наилучшими пожеланиями,

2

Один возможный способ с использованием select() ППР селектора CSS, проходящий в качестве параметра. Например, если вы действительно хотите, чтобы строго выбрать <tag4> с такой предок иерархии:

..... 
xmldata=BeautifulSoup(fadata) 
for tag4 in xmldata.select("tag > tag1 > tag2 > tag3 > tag4"): 
    print tag4["data"] 

Над напечатает следующее:

data1 
data2 

Или, если вам нужно только все <tag4> элементы там, где они находятся в XML, вы можете просто использовать xmldata.select("tag4").

+0

если я хочу получить родительский узел тега 4, то что делать? Я попробовал 'x = xmldata.select ('tag4') для узла в x: print (node.parentNode)' – fhulprogrammer

+0

вы можете попробовать: 'node.parent' вместо' node.parentNode' – har07

 Смежные вопросы

  • Нет связанных вопросов^_^