2016-07-29 84 views
4

我试图解析一些XML是按以下格式:LXML eTree iterparse深度

<label> 
     <name></name> 
     <sometag></sometag> 
     <sublabels> 
      <label></label> 
      <label></label> 
     </sublabel> 
</label> 

与此

for event, element in etree.iterparse(gzip.GzipFile(f), events=('end',), tag='label'): 
    if event == 'end': 
     name = element.xpath('name/text()') 

解析它产生,因为

的空 变量
<sublabels> 
     <label></label> 
     <label></label> 
</sublabel> 

问题:

是否有任何方法来设置iterparse的深度或忽略子标签的标签,而不是检查它是否为空?

回答

0

说出来的第一件事想到

path = [] 
for event, element in etree.iterparse(gzip.GzipFile(f), events=('start', 'end')): 
    if event == 'start': 
     path.append(element.tag) 
    elif event == 'end': 
     if element.tag == 'label': 
      if not 'sublabels' in path: 
       name = element.xpath('name/text()') 
     path.pop() 
3

这对我的作品,由以前的答案启发:

name = None 
level = 0 
for event, element in etree.iterparse(gzip.GzipFile(f), events=('end', 'start'), tag='label'): 
    # Update current level 
    if event == 'start': level += 1; 
    elif event == 'end': level -= 1; 
    # Get name for top level label 
    if level == 0: 
     name = element.xpath('name/text()') 

作为一个替代的解决方案,解析整个文件,并使用XPath获得顶级标签名称:

from lxml import html 

with gzip.open(f, 'rb') as f: 
    file_content = f.read() 
    tree = html.fromstring(file_content) 
    name = tree.xpath('//label/name/text()') 
+0

该文件是巨大的。一次解析洞洞事件不是一种选择。 – abruski