1

URL から次の xml を解析中に問題が発生しました。

URL パスのサンプル 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>

以下は私のpythonコードです。

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

forloop 内で、同じ親クラスに属する xml の person タグと url タグの値を出力したいと考えています。

繰り返しで次の方法を試しましたが、 「解凍するには値が多すぎます」というエラーが表示されます

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

助言がありますか ?

4

3 に答える 3

3

あなたzip()は要素を組み合わせるために使用したいと思います、私は思います:

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

ただし、自分自身に大きな恩恵を与え、代わりにElementTreeAPIを使用してください。そのAPIは、XML DOM APIよりもはるかにPythononicであり、使いやすいです。

于 2012-10-12T11:03:54.950 に答える
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 Pietersが言ったように、代替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')
于 2012-10-12T11:07:38.067 に答える
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']]
于 2012-10-12T11:43:35.040 に答える