2013-01-05 4 views

답변

13

HTML 입력이 깨졌습니다. < 왼쪽 꺾쇠 괄호는 &lt;으로 인코딩되어야합니다. lxml documentation에서 깨진 HTML 구문 분석 :

깨진 HTML을 구문 분석하기위한 지원은 전적으로 libxml2의 복구 알고리즘에 달려 있습니다. 파서가 처리 할 수없는 문서가 너무 많이 파손 된 경우 lxml의 잘못이 아닙니다. 결과 트리에 원본 문서의 모든 데이터가 포함된다는 보장이 없습니다. 구문 분석을 계속하기 위해 고심 할 때 구문 분석기는 심각하게 손상된 부분을 제거해야 할 수 있습니다. 특히 잘못 배치 된 메타 태그로 인해 이러한 문제가 발생하여 인코딩 문제가 발생할 수 있습니다.

즉, 그러한 문서에서 얻을 수있는 것을 취하십시오. lxml은 깨진 HTML을 처리하는 방법을 달리 구성 할 수 없습니다.

수있는 건다른 HTML 파서를 사용하는 것입니다. 대신 BeautifulSoup을 시도해보십시오. 깨진 HTML 처리 기능으로 원하는 문서를 제공 할 수있는 다른 버전의 문서를 제공 할 수 있습니다. BeautifulSoup은 lxmlhtml5lib을 포함하여 다른 파서 백엔드를 다시 사용할 수 있으므로 유연성이 향상됩니다.

html5lib 파서는 당신에게 (A &lt; 탈출로 변환)을 < 문자 준다 :

>>> BeautifulSoup("<div> < 20 </div>", "html5lib") 
<html><head></head><body><div> &lt; 20 </div></body></html> 
+0

우, 잠시 동안 많은 html 자료를 작성하지 않았으며, '<'의 끝에 세미콜론을 잊어 버렸습니다. – Volatility

+3

대답은 훌륭합니다. html5lib에서 BS 사용에 대한 귀하의 제안은 문제를 해결합니다. 고맙습니다. 사람들은 downvote - 나는 그들이 문제를 이해하지 않는 것 같아요. – Viacheslav

+1

이미'lxml'을 사용하고 있기 때문에 w3c의 권장 구문 분석 방법 (이론적으로 브라우저가 사용하는 것)을 따르는 [html5parser] (http://lxml.de/html5parser.html)). – mlissner

2

<은 실제로 &lt;이어야합니다. <은 html의 '예약 된 문자'와 비슷합니다. 그렇다면 그것은 작동합니다.

+0

고마워요.하지만 '<'로 명시 적으로 작동해야합니다. – Viacheslav

+0

원하는 것은 여기서 특별한 관심이 없습니다. 마크 업은 올바른 형식이 아닙니다. XML 구문 분석기는 휴지통 마크 업을 수정해야 할 필요가 없습니다. 마크 업을 먼저 수정하십시오 * –

+8

네거티브 톤은 부적합합니다. 나는 3 부 HTML 페이지를 긁어 모으고 그것을 그대로 분석해야한다. 내가 제시 한 예는 그 문제를 보여주기위한 것입니다. – Viacheslav

관련 문제