繁体   English   中英

dic python,lxml和xml的xpath

[英]xpath to dic python, lxml and xml

有没有一种快速的方法,可以在Python中使用来自lxml的xpath将以下xml转换为字典? 还是其他有效的方法?

<rec item="1">
    <tag name="atr1">random text</tag>
    <tag name="atr2">random text</tag>
    ..................................        
</rec>
<rec item="2">
    <tag name="atr1">random text2</tag>
    <tag name="atr2">random text2</tag>
    ..................................        
</rec>
<rec item="3">
    <tag name="atr1">random text3</tag>
    <tag name="atr2">random text3</tag>
    ..................................        
</rec>

需要像这样的字典,或其他类似符号:

dic = [
    {    
        'attr1':'random text',
        'attr2':'random text'
    },
    {    
        'attr1':'random text2',
        'attr2':'random text2'
    },
    {    
        'attr1':'random text3',
        'attr2':'random text3'
    }
]

您可以将列表理解与字典理解一起使用:

[{ tag.xpath('string(@name)') : tag.xpath('string()') for tag in record.xpath('tag')} for record in records.xpath('//rec')]

这是一个完整的示例:

from lxml import etree as ET
xml = '''<records>
<rec item="1">
    <tag name="atr1">random text</tag>
    <tag name="atr2">random text</tag>
    ..................................        
</rec>
<rec item="2">
    <tag name="atr1">random text2</tag>
    <tag name="atr2">random text2</tag>
    ..................................        
</rec>
<rec item="3">
    <tag name="atr1">random text3</tag>
    <tag name="atr2">random text3</tag>
    ..................................        
</rec>
</records>'''
records = ET.fromstring(xml)
rec_list = [{ tag.xpath('string(@name)') : tag.xpath('string()') for tag in rec.xpath('tag') } for rec in records.xpath('rec')]
print(rec_list)

产出

[{'atr1': 'random text', 'atr2': 'random text'}, {'atr1': 'random text2', 'atr2': 'random text2'}, {'atr1': 'random text3', 'atr2': 'random text3'}]

您可以尝试以下代码:

source = lxml.etree.fromstring('xml_source_is_here')
[{attr:text} for attr,text in zip(source.xpath('//tag/@name'), source.xpath('//tag/text()'))]

输出:

[{'atr1': 'random text'}, {'atr2': 'random text'}, 
{'atr1': 'random text2'}, {'atr2': 'random text2'}, 
{'atr1': 'random text3'}, {'atr2': 'random text3'}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM