2012-02-03 12 views
0

이 질문의 범위를 벗어나는 여러 가지 이유로 python으로 작성된 adhoc html 구문 분석 클래스를 사용하고 있습니다. 이 간단한 클래스는 먹이를 먹는 데는 아직까지는 충분하지만 최근에 구문 분석을 시도했습니다. http://forum.macbidouille.com/index.php?showtopic=160607HTML 구문 분석 중 오류 처리

이 웹 페이지는 분명히 일부 PHP 코드에 의해 자동 생성되지만 분명히 사용자 생성 HTML을 포함하고 있습니다. 각 게시물에 대한 서명. 특히, http://forum.macbidouille.com/index.php?showtopic=160607#entry1563022는 다음과 같은 HTML (명확성을 위해 들여 쓰기를 제거 주석 및 태그)가 포함되어

<div class="signature"> 
    <span style="font-family:Verdana"> 
    <span style="color:#8B0000"> 
     <span style="font-size:12pt;line-height:100%"> 
     <div align='center'>La Culture coûte cher, mais l&#39;inculture coûte encore plus cher à la Société. <br /> 
      <span style="font-size:8pt;line-height:100%"><i>Marcel Landowsky</i></span> 
     </span><br /> 
     </div> 
     </span> 
    </span> 
    <div align='left'><br />macbook unibody 10.6.8 - 2.26ghz - 4Go- 250Go - <br />Je n&#39;ai pas de télévision &#33;</div> 
</div> 

으로는 위에서 명백해야한다를 너무 일찍 닫혀 길 잃은 태그가있다. 즉, 여기에 잘못된 HTML이 있습니다. 특별한 것은 없지만 이것이 파싱 코드를 실패하게하는 데 충분합니다. 특히, 지금까지 파싱 코드는 매우 간단한 오류 처리 전략을 가지고 있습니다. 각 닫는 태그를 현재 열린 태그와 비교하려고 시도하고 닫는 태그가 일치하지 않으면 무시됩니다.

위 코드의 경우 5 행의 현재 열려있는 태그와 일치하지 않으므로 7 행에서 무시한 다음 2 행의 현재 열린 태그와 일치하지 않으므로 마지막 행에서 무시합니다. 결과는이 블록을 따르는 모든 HTML이 나중에 다른 문제로 이어지는 첫 번째 태그 내에 계층 적으로 포함된다고 가정합니다.

내가 얻고 싶은 것은 구문 분석 상태를 '동기화'하는 것이고 어떤 종류의 간단한 접근 방식이이 html 블록을 처리 할 수있는 파서로 연결되는지 궁금합니다. 생성 된 트리를 다시 배열하여 구문 분석을 완료하면 닫는 태그의 수를 최소화하는 방법을 알 수 있지만 더 간단한 솔루션을 찾고 있습니다.

첫 번째 대답은 "라이브러리 X 사용"입니다.이 작업이 끝날 가능성이 높지만 실제로 흥미로운 파싱 및 오류 처리 전략을 사용할 수 있는지 궁금합니다. 이 경우. 즉, 저는 교육을 받으려고합니다.

감사합니다!

+0

이것이 좋은지는 잘 모르겠지만 태그를 무시하는 대신 암기하고 계속 진행할 수 있습니다. 다음 불일치시 암기 된 태그가 불일치를 해결하는지 확인하고 현재 불일치 대신 사용합니다. – Christoph

답변

0

가장 좋은 방법은 사용자 제공 HTML을 먼저 구문 분석 (및 수정)하는 것입니다. 그렇지 않으면 모든 종류의 원본 DOM 구조가 손상 될 수 있습니다. 첫째, 사용자 HTML에서 중첩 태그를 확인하고 삭제해야합니다 (예 : </span>에는 해당 시작 태그가 없으므로 제거해야 함). HTML 전용 구문 분석기를 사용하는 경우 사용자 HTML을 구문 분석하기 전에 <div>..</div>에 입력하십시오. 이렇게하면 트릭을 수행 할 수 있습니다.

+0

_original_ 사용자 입력에 액세스 할 수 없지만 문서에서 정확히 시작되는 위치를 알고있는 경우 사용자가 HTML을 시작하는 순간에 문서를 구문 분석하고 태그 스택을 유지할 수 있습니다. 그런 다음 문서의 끝으로 진행하여 중첩 불일치가 있는지 확인하십시오. –