2013-07-17 2 views
1

div와 함께 이미지 배치 문제가 있습니다.lxml은 요소가있는 텍스트를 이동합니다.

from lxml.html import fromstring 
from lxml import etree 

tree = fromstring('<img src="/img.png"/> some text') 
div = etree.Element('div') 
div.insert(0, tree.find('img')) 
tree.insert(0, div) 
print etree.tostring(tree) 

<span><div><img src="/img.png"/> some text</div></span>

이 왜 스팬을 추가 않으며, 나는 그것이 텍스트없이 이미지를 포장하는 방법을 만들 수 있습니까?

답변

1

lxml.html은 잘못된 xml을 이해하려고 애쓰는 친절한 gentler xml 프로세서입니다. 당신이 전달한 찌름은 XML 관점에서 볼 때 정크이지만, lxml.html은 다시 유효하게하기 위해 그것을 span 엘리먼트에 래핑했습니다. lxml.html guestimating을 원하지 않으면 lxml.etree.fromstring()을 사용하십시오. 해당 버전은 문자열을 거부합니다.

3

lxml은 acutally xml 파서이므로. 그것에는 html (lxml.html 부분)을 구문 분석 할 수있게 해주는 용서할 수있는 구문 분석 규칙이 있지만 내부적으로 항상 유효한 트리를 작성합니다.

'<img src="/img.png"/> some text'은 단일 루트 요소가 없으므로 트리가 아니며 img 요소와 텍스트 노드가 있습니다. 이 스 니펫을 내부적으로 저장할 수 있으려면 lxml이이를 적절한 태그로 묶어야합니다. 문자열 하나만 입력하면 p 태그로 묶습니다. 이전 버전에서는 html 태그의 모든 내용을 래핑 했으므로 더 혼란 스러울 수 있습니다.

이 경우 태그를 추가하지 않고 조각이 유효하지 않으므로 오류가 발생하는 html.fragment_fromstring을 사용할 수도 있습니다.

텍스트가 img 태그에 집착하는 이유는 lxml이 텍스트를 저장하는 방식입니다. 이 예의 경우 :

>>> p = html.fromstring("<p>spam<br />eggs</p>") 
>>> br = p.find("br") 
>>> p.text 
'spam' 
>>> br.text  # empty 
>>> br.tail  # this is where text that comes after a tag is stored 
'eggs' 

그래서 태그를 움직이면 꼬리도 움직입니다.

관련 문제