2011-01-31 7 views
-1

documentation on CPAN 뭔가를 놓치지 않는 한이 동작을 실제로 설명하지 않습니다. 나는 내 문제를 설명하기 위해 함께 몇 가지 빠른 테스트 코드를 삽입했습니다 위의 스크립트를 실행 한 후HTML :: TreeBuilder의 "parent"함수는 정확히 어떻게 작동합니까?

#!/usr/bin/perl 
use warnings; 
use strict; 

use HTML::TreeBuilder; 

my $testHtml = " 
<body> 
     <h1> 
       <p> 
         <p>HELLO! 
         </p> 
       </p> 
     </h1> 
</body>"; 

my $parsedPage = HTML::TreeBuilder->new; 
$parsedPage->parse($testHtml); 
$parsedPage->eof(); 

my @p = $parsedPage->look_down('_tag' => 'p'); 

foreach (@p) {print $_->parent->tag, " : ", $_->tag, "\t", $_->as_text, "\n";} 

을, 출력은 다음과 같습니다

body : p 

body : p  HELLO! 

모든 태그가 차례로 중첩으로보고, 나는 첫 번째 p 태그의 부모는 h1이고 두 번째 p 태그의 부모는 p이라고 생각할 것입니다. 상위 기능이 두 가지 모두에 body 태그를 표시하는 이유는 무엇입니까?

답변

2

고객님의 HTML은 유효하지 않습니다. 그리고 HTML :: TreeBuilder가 HTML :: Parser의 하위 클래스이기 때문에 파서가 올바른 HTML로 문서를 변형 할 수 있다고 가정 할 수 있습니다.

파서가 HTML에 대해 수행 한 작업을 보려면 $ parsedPage-> as_HTML을 호출 할 수 있습니다. 그것은 나에게주는이 :

<html><head></head><body><h1></h1><p><p>HELLO! </body></html> 

이 아마도 당신이 그것을 처리하기 전에, 발리 또는 HTML :: 깔끔한 통해 HTML을 통과해야한다.

+0

흠, 샘플은 구문 분석해야하는 HTML의 일종의 레크리에이션 일뿐입니다. 유효하지 않은 HTML을 처리하는 최선의 방법이 무엇인지 확신 할 수 없습니다. – s2cuts

+0

실제로 HTML :: Parser는 어떤 태그가 서로 내부에 중첩되도록 허용되는지 신경도 쓰지 않습니다. 시작 태그, 종료 태그, 텍스트 등을 인식하는 것은 HTML :: Parser에 의해 생성 된 이벤트를 취하고 유효하게 중첩 된 트리를 구성하는 HTML :: TreeBuilder입니다. 대부분의 브라우저와 같은 방식으로 잘못된 HTML을 처리합니다. – cjm

관련 문제