假设我想用lxml xpath表达式解析下面的xml
<pack xmlns="http://ns.qubic.tv/2010/item">
<packitem>
<duration>520</duration>
<max_count>14</max_count>
</packitem>
<packitem>
<duration>12</duration>
</packitem>
</pack>
这是http://python-thoughts.blogspot.fr/2012/01/default-value-for-text-function-using.html
的变体如何解析一下拉链后会给我的不同元素(在zip或izip python函数意义上)
[(520,14),(12,无)]
第二个packitem中缺少的max_count
标签让我无法获得我想要的东西。
答案 0 :(得分:3)
def lxml_empty_str(context, nodes):
for node in nodes:
node.text = node.text or ""
return nodes
ns = etree.FunctionNamespace('http://ns.qubic.tv/lxmlfunctions')
ns['lxml_empty_str'] = lxml_empty_str
namespaces = {'i':"http://ns.qubic.tv/2010/item",
'f': "http://ns.qubic.tv/lxmlfunctions"}
packitems_duration = root.xpath('f:lxml_empty_str('//b:pack/i:packitem/i:duration)/text()',
namespaces={'b':billing_ns, 'f' : 'http://ns.qubic.tv/lxmlfunctions'})
packitems_max_count = root.xpath('f:lxml_empty_str('//b:pack/i:packitem/i:max_count) /text()',
namespaces={'b':billing_ns, 'f' : 'http://ns.qubic.tv/lxmlfunctions'})
packitems = zip(packitems_duration, packitems_max_count)
>>> packitems
[('520','14'), ('','23')]
http://python-thoughts.blogspot.fr/2012/01/default-value-for-text-function-using.html
答案 1 :(得分:1)
您可以使用xpath
查找packitem
,然后再次致电xpath
(或findtext
,如下所示),找到duration
和max_count
秒。不得不多次拨打xpath
可能不会很快,但它确实有效。
import lxml.etree as ET
content = '''<pack xmlns="http://ns.qubic.tv/2010/item">
<packitem>
<duration>520</duration>
<max_count>14</max_count>
</packitem>
<packitem>
<duration>12</duration>
</packitem>
</pack>
'''
def make_int(text):
try:
return int(text)
except TypeError:
return None
namespaces = {'ns' : 'http://ns.qubic.tv/2010/item'}
doc = ET.fromstring(content)
result = [tuple([make_int(elt.findtext(path, namespaces = namespaces))
for path in ('ns:duration', 'ns:max_count')])
for elt in doc.xpath('//ns:packitem', namespaces = namespaces) ]
print(result)
# [(520, 14), (12, None)]
另一种方法是使用SAX解析器。这可能会快一些,但它需要更多的代码,如果XML不是很大,速度差异可能并不重要。