python的lxml和iterparse方法

3 投票
2 回答
6737 浏览
提问于 2025-04-16 14:49

假设我有这个示例 XML。

<result>
    <field k='field1'>
        <value h='1'><text>text_value1</text></value>
    </field>
    <field k='field2'>
        <value><text>text_value2</text></value>
    </field>
    <field k='field3'>
        <value><text>some_text</text></value>
    </field>
</result>

我想用 Python 的 lxml 库,怎么才能获取每个结果集里每个字段的值呢?简单来说,我想遍历每个结果集,然后再遍历每个字段,最后打印出文本数据。

这是我目前写的代码:

context = etree.iterparse(contentBuffer, tag='result')
for action, elem in context:
    print elem.tag, elem.data

任何帮助都将非常感谢。

编辑

这是我想出来的代码。为了读取对应文本值的属性,我不得不调用 getparent() 两次,这样感觉有点繁琐。有没有更好的方法呢?

for action, elem in context:
    list = elem.xpath('//text')
    print "result set:"
    for item in list:
        field = item.getparent().getparent().attrib['k']
        value = item.text
        print "\t%s = %s"%(field, value)

2 个回答

1

我建议你使用一个叫做XPath查询的东西。像这样写r = tree.xpath('//text')就应该能满足你的需求。

4

这样怎么样:

import io
import lxml.etree as ET

content='''\
<result>
    <field k='field1'>
        <value h='1'><text>text_value1</text></value>
    </field>
    <field k='field2'>
        <value><text>text_value2</text></value>
    </field>
    <field k='field3'>
        <value><text>some_text</text></value>
    </field>
</result>'''

contentBuffer=io.BytesIO(content)
context = ET.iterparse(contentBuffer,tag='result')
for action, elem in context:
    fields=elem.xpath('field/@k')
    values=elem.xpath('field/value/text/text()')
    for field,value in zip(fields,values):
        print('\t{f} = {v}'.format(f=field,v=value))

这样会得到

field1 = text_value1
field2 = text_value2
field3 = some_text

撰写回答