2011-01-13 4 views
17

문제는 이것이다 : 나는 XML 조각과 같이 가지고있다 -과 <c> -Tags, 그러나 그들의 (텍스트) 옵션 의상과 childNodes에 그냥 유지하는 결과를 들어lxml에서 태그를 제거하지만 모든 내용을 유지하려면 어떻게해야합니까?

<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment> 

, 나는 모든 <a>를 제거하려면 그들은 그대로 또한 <b> -Element는 변경하지 않아야합니다. 결과는 다음 나는 아주 더러운 속임수로 되돌릴 것, 당분간 따라서

<fragment>text1 inner<d>1</d> text2 <b>inner2</b> text3</fragment> 

을 보일 것입니다 : 나는 조각을 etree.tostring 정규식을 통해 잘못된 태그를 제거하고 원래 조각을 대체 할 수 있습니다 이것의 etree.fromstring 결과 (안 실제 코드는하지만,이 같은 가야) : 나는 아마 이것을 달성하기 위해 XSLT를 사용할 수 있다는 것을 알고

from lxml import etree 
fragment = etree.fromstring("<fragment>text1 <a>inner1 </a>text2 <b>inner2</b> <c>t</c>ext3</fragment>") 
fstring = etree.tostring(fragment) 
fstring = fstring.replace("<a>","") 
fstring = fstring.replace("</a>","") 
fstring = fstring.replace("<c>","") 
fstring = fstring.replace("</c>","") 
fragment = etree.fromstring(fstring) 

을, 나는 그 LXML는 XSLT의 사용을 만들 수있어 ,하지만 더 많은 lxml 네이티브 접근 방식이 있어야합니까?

참고 : 나는 lxml의 element.replace를 가지고 거기에 도달하려고 시도했지만, 전에 요소 노드가있는 곳에 텍스트를 삽입하고 싶기 때문에 그렇게 할 수 있다고 생각하지 않습니다.

답변

31

이 시도 : LXML의 http://lxml.de/api/lxml.etree-module.html#strip_tags

>>> etree.strip_tags(fragment,'a','c') 
>>> etree.tostring(fragment) 
'<fragment>text1 inner1 text2 <b>inner2</b> text3</fragment>' 
+0

감사합니다. 완벽하게 작동합니다. "스트립"이라는 단어가 나에게 발생하지 않았거나 직접 대답을 찾았을 수도 있습니다. – Thor

+0

진지하게. PyCon 2011에 갈 예정입니까? 그렇다면 맥주 나 다른 음료를 사주 게하십시오. 당신은 방금 내 밤을 만들었습니다 :) – mkelley33

+0

또한 끝내줍니다 :''etree.strip_elements (조각, * [ 'tag1', 'tag2'])'' – mkelley33

1

사용 클리너 기능은 HTML 내용에서 태그를 제거 할 수 있습니다. 다음은 원하는 것을 수행하는 예제입니다. HTML 문서의 경우 클리너는 strip_elements를 사용하는 것보다 문제에 대한 더 나은 해결책입니다. 왜냐하면이 경우에는 태그 이외의 것을 제거해야하기 때문입니다. 또한 다른 태그에서 onclick = function() 특성을 없애고 자합니다.

import lxml 
from lxml.html.clean import Cleaner 
cleaner = Cleaner() 
cleaner.remove_tags = ['p'] 
remove_tags: 

제거 할 태그 목록입니다. 태그 만 제거되고 내용은 상위 태그로 끌어 올려집니다.

관련 문제