2010-05-21 2 views
3

변수에 저장된 HTML 콘텐츠가 있습니다. 페이지의 공통 태그 집합 사이에있는 데이터를 추출하려면 어떻게합니까? 예를 들어, 나는 DATA으로 표시 데이터 (에 관심이 한 줄 다른 후 태그 집합 사이에 유지 : 다음Perl의 Grep 및 Extract 데이터

... 
<td class="jumlah">*DATA_1*</td> 
<td class="ud"><a href="">*DATA_2*</a></td> 
... 

그리고 난에 매핑 데이터 2 => 데이터 1을 저장하고 싶습니다 이 HTML 나는이 당신을 위해 일할 수 있다고 생각하기 때문에

답변

0

HTML이기 때문에 XPath 모듈이 HTML 작업을 위해 만들어진 것일 수도 있습니다 (HTML::TreeBuilder::XPath).

먼저 HTML :: TreeBuilder 메서드를 사용하여 문자열을 구문 분석해야합니다.

my $tree = HTML::TreeBuilder->new; 
$tree->parse_file($file_name); 

지금 당신이 관심있는 노드를 통해 반복자를 얻을 수 XPath 표현을 사용할 수 있습니다 웹 페이지의 내용을 가정하면 다음과 같이 그것을, $content라는 변수입니다. 첫 번째 표현식은 html 요소에 body에서 tabletr에있는 모든 td 노드를 가져옵니다

마지막으로
my $tdNodes = $tree->findnodes('/html/body/table/tr/td'); 

당신은 당신이 원하는 것을 찾기 위해 루프에서 모든 노드를 반복 할 수 있습니다

foreach my $node ($tdNodes->get_nodelist) { 
    my $data = $node->findvalue('.'); // the content of the node 
    print "$data\n"; 
} 

자세한 내용은 HTML::TreeBuilder 설명서를 참조하고 NodeSet 결과 개체 사용 방법은 NodeSet 설명서를 참조하십시오. w3schools에는 통행 할 수있는 XPath 튜토리얼 here이 있습니다.

이 모든 것으로, 당신은 당신이 원하는 모든 요소를 ​​잡아 내기 위해 매우 견고한 HTML 파싱을 할 수 있어야합니다. XPath 쿼리에서 클래스, ID 등을 지정하여 원하는 노드를 구체적으로 지정할 수도 있습니다. 필자가 생각하기에,이 수정 된 XPath 라이브러리를 사용하여 HTML을 파싱하는 것은 일회성 정규식을 다루는 것보다 훨씬 빠르고 유지 보수가 용이합니다.

+0

+1 예를 들어 코드. –

2

해시?

https://metacpan.org/pod/XML::XPath

의 XPath는 방법입니다.

+1

XPATH가 XML로 제한되지 않으므로 (따라서 XHTML에만 해당)?나는 매우 제한된 경험을 가지고 있지만 결코 X가 아닌 HTML을 처리하는 것을 보지 못했다. – DVK

+0

@DVK : 나는 Perl로 개발 된 XPath 모듈을 조금 더 영리하게하려고 시도하지 않았다. – Axeman

+0

@Axeman - touche :) – DVK

0

답변 : to this Q - HTML :: TreeBuilder 또는 HTML :: Parser에 설명 된대로 HTML 구문 분석 모듈을 사용하십시오.

순전히 이론적으로 이것을 수행하기 위해 정규 표현식을 사용하여 시도 할 수 있지만 연결된 질문의 답변과 수많은 다른 시점에 나와 있으므로 RegEx로 HTML을 구문 분석하는 것은 대문자가 포함 된 잘못된 아이디어입니다 - 잘못하기 쉽고, HTML이 규칙적인 언어가 아니기 때문에 100 % 제대로 할 수는 없습니다.

+0

이론적으로 불가능할 수도 있습니다. HTML은 정규 언어가 아닙니다. 그의 질문이 "규칙적인"것이라면 가능할 것입니다. –

0

이 모듈을 사용해보십시오. HTML::TreeBuilder::XPath. doc :

이 모듈은 문서를 쉽게 쿼리 할 수 ​​있도록 일반적인 XPath 메서드를 HTML :: TreeBuilder에 추가합니다.