2010-08-12 16 views
0

나는 다음과 같은 XML 문서가 :이상한 행동

<x> 
    <a>Some text</c> 
    <b>Some text 2</b> 
    <c>Some text 3</c> 
</x> 

내가 모든 태그의 텍스트를 얻으려면, 그래서 getiterator()를 사용하기로 결정합니다.

내 문제는 내가 이해할 수없는 이유로 빈 줄을 추가하는 것입니다. 이것을 고려해보십시오 :

>>> for text in document_root.getiterator(): 
...  print text.text 
... 


Some text 
Some text 2 
Some text 3 

'Some text'앞에 두 개의 공백 행이 있습니다. 이것에 대한 이유는 무엇입니까? getiterator() 메서드에 태그를 전달하면 빈 줄이 없어야합니다.

>>> for text in document_root.getiterator('a'): 
...  print text.text 
... 
Some text 

그래서 제 질문은, 어떻게 내가 태그없이 getiterator()를 통과 할 경우 그 여분의 빈 줄을 일으키는이며 어떻게 제거합니까?

+0

나는 또한 시도 :'if text.text == '\ n': continue' 그래서 빈 줄을 건너 뛰지 만 그렇게하지는 않습니다. – user225312

답변

2

문제입니다. 텍스트가 전혀없는 경우 node.text가 None을 반환하는 방법을

from lxml import etree 

parser = etree.XMLParser(remove_blank_text=True) 

tree = etree.XML("""\ 
    <x> 
     <a>Some text</a> 
     <b>Some text 2</b> 
     <c>Some text 3</c> 
    </x> 
""", parser) 

for node in tree.iter(): 
    if node.text == None: continue 
    print node.text 

주 : 당신은 당신이 그런 짓을하려는거야 공백을 무시하는 파서를합니다. the API documentation for lxml에는 getiterator() 대신에 iter()이 사용되지 않습니다.

자세한 내용은 The lxml.etree Tutorial: Parser objects을 참조하십시오.

+0

감사합니다. 이것은 내 질문에 완벽하게 대답합니다. – user225312

+0

서비스의 기쁜 소식 - –

+0

작은 말 :'None'은 독특하기 때문에'if node.text is None'을 직접 사용할 수 있습니다 (내 의견으로는). 내 두 센트! –

0

확실하지 않지만 나는 < x> 내에 텍스트를 읽으려고한다고 가정합니다.

어쨌든, 무엇 <x>에서 온다 표시되는 공백이 태그의 텍스트 내용으로하고 경우에 태그 사이에 빈 텍스트 간주됩니다 기본 lxml.etree으로

for text in document_root.getiterator(): 
    if text.strip() == '': continue 
    print text 
+0

Aah. 'strip()'도 사용할 수 있다는 것을 잊어 버렸습니다. – user225312

+0

그것은 내 문제를 해결하지만 그것이 일어나는 이유에 대한 질문이 남아 있습니다. – user225312

+0

요소 에는 텍스트가 포함되어 있기 때문에이 경우 공백이지만 텍스트이지만 그럼에도 불구하고 텍스트입니다. –