2010-08-19 6 views
0

lxml의 lxml.etree.iterparse에서 여러 태그 이름을 가져 오는 방법이 있습니까? 값 비싼 읽기 작업과 많은 태그를 가진 파일 같은 객체가 있으므로 모든 태그를 가져 오거나 두 번 통과하는 것이 차선책입니다.lxml의 iterparse에 여러 태그 이름이 있습니까?

편집 : iterparse의 인수를 제외하고는 Beautiful Soup의 find(['tag-1', 'tag-2])과 같을 것입니다. <td><div> 태그에 대한 HTML 페이지 구문 분석을 가정 해보십시오.

+2

당신이 예를 추가 할 수 있습니까? "여러 태그 이름"이 무슨 뜻인지 확신 할 수 없습니다. 원하는 옵션이 여러 개인 .find()를 수행하는 것과 같은 의미입니까? XML의 간단한 섹션 (또는 XML로 작성한 것)의 예가 가장 적합 할 것입니다. – nearlymonolith

답변

3

I 해요 당신이 "모든 태그를지고"로 여기에 의미하지만, 아마도 이것이 당신이 찾고있는 무엇 100 % 확실하지 : 그래서,

for event, elem in iterparse(file_like_object): 
    if elem.tag == 'td' or elem.tag == 'div': 
     # reached the end of an interesting tag 
     print 'found:', elem.tag 
     # possibly quit early to prevent further parsing 
     if exit_condition: break 

iterparse 구문 분석하는 동안 즉석에서 이벤트를 생성 필요한만큼의 데이터를 읽는 것뿐입니다. 그러나 구문 분석 중에 요소를 건너 뛸 수있는 방법은 없습니다. 건너 뛸 거리를 모를 수 있기 때문입니다. 위의 경우 우리는 관심이없는 태그를 무시합니다.

이미 알고 계시 겠지만 : xml 파서를 html로 사용하지 마십시오. 편집 - lxml이 html 구문 분석을 지원하지만 문서를 확인하여 어느 정도를 확인해야합니다.

+0

좋은 예, 고마워. iterparse의 tag 매개 변수로 태그를 제한 할 수 있지만 여러 태그를 넣을 수는 없다고 생각합니다. – Chris

4

나는 게임에 늦었지만 다른 사람이 같은 문제에 도움이 필요할 수도 있음을 알고 있습니다. 모두 Tag1에 대한 이벤트 및 Tag2 태그 생성이 코드 :

etree.iterparse(io.BytesIO(xml), events=('end',), tag=('Tag1', 'Tag2')) 
관련 문제