2016-12-09 1 views
0

다음 두 코드 스 니펫이 다른 출력을주는 이유는 무엇입니까? 첫 번째 경우의 h1 태그가 두 번째 경우의 h 태그로 바뀌는 유일한 차이점이 있습니다. h1 태그에 html로 특별한 "의미"가 있기 때문입니까? 나는 h1에서 h6까지 시도했으며 모두 을 출력으로, h7으로 출력하면 [u'xxx']을 출력하기 시작했습니다.h1-h6 태그에 대한 xprocess selector의 동작

from scrapy import Selector # scrapy version: 1.2.2 

text = '<h1><p>xxx</p></h1>' 
print Selector(text=text).xpath('//h1/p/text()').extract() 
Output[1]: [] 

text = '<h><p>xxx</p></h>' 
print Selector(text=text).xpath('//h/p/text()').extract() 
Output[2]: [u'xxx'] 

답변

3

안에 p 태그를 포함하면 W3C에 따라 유효하지 않습니다.

sel = Selector(text="anyxml", type="xml") 

이 어떤 XML 구조를 존중 : 당신은이를 무시하고 그냥 xml 구조 작업을 방금이 같은 type을 변경할 수 있습니다 위해, 어쨌든이 here

에 대한 자세한 내용을 볼 수 있습니다.

1

짧은 대답은 h1 ... h6가 잘 형성된 HTML 문서에 HTML을 구문 분석 할 때 그렇게하지 않습니다 (힘 Scrapy 선택기) 적어도 LXML을 <p>이 포함되지 않아야한다는 것입니다. lxml은 잘못된 형식을 처리하지만이 경우에는 약간 다릅니다.

당신은 어떻게 LXML 파싱을 확인하고 HTML 코드를 다시 직렬화 할 수

>>> from scrapy import Selector 
>>> text = '<h1><p>xxx</p></h1>' 
>>> s = Selector(text=text) 
>>> print(s.extract()) 
<html><body><h1></h1><p>xxx</p></body></html> 

그래서 LXML는 h1p 태그를 발견하면, 그것은 뒤에 놓는다. p 요소는 손실되지 않지만 HTML 소스를 읽을 때 예상되는 위치는 아닙니다.

다른 조각 대

:

>>> text = '<h><p>xxx</p></h>' 
>>> s = Selector(text=text) 
>>> print(s.extract()) 
<html><body><h><p>xxx</p></h></body></html> 
>>> 

h 요소 LXML에 대한 특별한 아무것도 의미하지 않는다, 그래서는 "hp는"확인입니다.

+0

인쇄물 (s.extract())이 후드 아래에 있음을 보여 주셔서 감사합니다! – FJDU

관련 문제