Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用minidom使用Python从URL解析XML_Python_Xml_Parsing_Minidom - Fatal编程技术网

使用minidom使用Python从URL解析XML

使用minidom使用Python从URL解析XML,python,xml,parsing,minidom,Python,Xml,Parsing,Minidom,从url解析以下xml时出现问题 我的url路径中的示例XML: <?xml version="1.0" encoding="utf-8"?> <Documents> <class> <mid name="yyyyyyyyyyyyy"></mid> <person name="yyyyyyyyyy"></person> <url name="yyyy

从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>
在forloop中,我想打印属于同一父类的xml中的person和url标记值

我尝试了下面的迭代方法,但得到的值太多,无法解包错误

def工作人员名单请求: url=http://path.to.url/ dom=minidom.parseurlopenurl person=dom.getElementsByTagName'person' mid=dom.getElementsByTagName'mid' url=dom.getElementsByTagName'url' 对于i、j、k本人、mid、url: 打印i.attributes['name'].值,j.attributes['name']值,k.attributes['name']值 有什么建议吗

如果您想使用zip来组合元素,我认为:

for i,j,k in zip(person, mid, url):
不过,帮自己一个大忙,用这个来代替;该API是pythononic,比XML DOM API更易于使用。

如果要使用zip组合元素,我认为:

for i,j,k in zip(person, mid, url):
不过,帮自己一个大忙,用这个来代替;该API远比XML DOM API更为pythononic,更易于使用。

如果您想继续使用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
正如@martijnpieters所说的,我们来看看ElementTree作为一种替代API。例如:

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')
如果要继续使用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
正如@martijnpieters所说的,我们来看看ElementTree作为一种替代API。例如:

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

我将使用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']]

我将使用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']]