2012-10-12 2 views
0

URL에서 다음 xml을 구문 분석하는 동안 문제가 있습니다. 내 URL 경로에minidom을 사용하여 URL에서 Python으로 XML 구문 분석

샘플 XML : 아래

<?xml version="1.0" encoding="utf-8"?> 
<Documents> 
    <class> 
     <mid name="yyyyyyyyyyyyy"></mid> 
     <person name="yyyyyyyyyy"></person> 
     <url name="yyyyyyyyy"></url> 
    </class> 
    <class> 
     <mid name="xxxxx"></mid> 
     <person name="xxxxxxxxxx"></person> 
     <url name="xxxxxxxxxxx"></url> 
    </class> 
</Documents> 

내 파이썬 코드;

def staff_list(request): 

    url = http://path.to.url/ 
    dom = minidom.parse(urlopen(url)) 
    person = dom.getElementsByTagName('person') 
    for i in person: 
     print i.attributes['name'].value 

for 루프 내 동일한 부모 클래스에 속한 xml의 person 태그와 url 태그 값을 인쇄하고 싶습니다.

나는 반복과 다음 방법을 시도하지만 "너무 많은 값을 풀고" ERROR

def staff_list(request): 

    url = http://path.to.url/ 
    dom = minidom.parse(urlopen(url)) 
    person = dom.getElementsByTagName('person') 
    mid = dom.getElementsByTagName('mid') 
    url = dom.getElementsByTagName('url') 
    for i,j,k in person,mid,url: 
     print i.attributes['name'].value,j.attributes['name'].value,k.attributes['name'].value 

어떤 제안을 얻을?

답변

2

당신은 요소를 결합하는 zip()를 사용하려면, 내 생각 :

for i,j,k in zip(person, mid, url): 

비록 자신에게 큰 호의를 수행하고 대신 ElementTree API를 사용; 이 API는 XML DOM API보다 훨씬 파이썬적이고 사용하기 쉽습니다.

+0

Thanks.Works을 – tunaktunak

1

당신은 당신이 당신의 루프를 변경할 수 있습니다 minidom을 고수 할 경우

for cls in dom.getElementsByTagName('class'): 
    person = cls.getElementsByTagName('person')[0] 
    mid = cls.getElementsByTagName('mid')[0] 
    url = cls.getElementsByTagName('url')[0] 

    print person.attributes['name'].value 
    print mid.attributes['name'].value 
    print url.attributes['name'].value 

@Martijn 피에 터스의 말처럼

는, 다른 API로 ElementTree를 보라. 예를 들어 :

import xml.etree.ElementTree as ET 
documents = ET.fromstring(xmlstr) 
for cls in documents.iter('class'): 
    person = cls.find('person') 
    mid = cls.find('mid') 
    url = cls.find('url') 

    print person.get('name'), mid.get('name'), url.get('name') 
0

나는 XPath와 lxml.html을 사용 : 미니멀 한 접근 방식 : 마법처럼

import lxml.html as lh 
doc=lh.parse(test.xml) 

In [70]: persons = doc.xpath('.//person/@name') 

In [71]: urls=doc.xpath('.//person[@name]/following-sibling::url/@name') 

In [72]: mids=doc.xpath('.//person[@name]/preceding-sibling::mid/@name') 

In [73]: [[p,m,u]for p,m,u in zip(persons, mids, urls)] 
Out[73]: 
[['yyyyyyyyyy', 'yyyyyyyyyyyyy', 'yyyyyyyyy'], 
['xxxxxxxxxx', 'xxxxx', 'xxxxxxxxxxx']]