2016-07-29 2 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의 깊이를 설정하거나 빈 레이블인지 확인하는 것 이외에 하위 레이블을 무시하는 방법이 있습니까? , 대체 솔루션으로

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를 사용

답변

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

마음합니다 최고 레이블 이름을 얻으십시오 :

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