2012-07-31 3 views
5

나는 웹 페이지에서 모든 링크를 추출하는 기본 스크립트를 작성 중입니다. Perl로 작성되었으며 WWAN :: Mechanize 및 HTML :: Treebuilder :: Xpath 모듈을 사용합니다. 둘 다 CPAN을 통해 설치했습니다.HTML Treebuilder 링크를 추출하는 XPath

나는 WWW :: Mechanize만을 사용하여 쉽게 할 수 있지만, XPath를 사용하여 쉽게 할 수 있다는 것을 알고있다.

그래서 스크립트는 전체 웹 페이지를 구문 분석하고 모든 앵커 태그에 대한 href 속성을 확인하고 링크를 추출하여 콘솔에 인쇄하거나 파일에 기록합니다. 아래 스크립트에서는 XPath를 사용하여 HTML 트리를 탐색하는 개념을 명확히 이해하기 위해이 글을 작성하기 때문에 엄격한 사용을 사용하지 않았습니다. 여기

는 스크립트입니다

#! /usr/bin/perl 

use WWW::Mechanize; 
use HTML::TreeBuilder::XPath; 
use warnings; 

$url="https://example.com"; 

$mech=WWW::Mechanize->new(); 
$mech->get($url); 

$tree=HTML::TreeBuilder::XPath->new(); 

$tree->parse($mech->content); 

$nodes=$tree->findnodes(q{'//a'}); # line is modified later. 

foreach $node($nodes) 
{ 
    print $node->attr('href'); 
} 

그리고 오류 제공 : 다음과 같이 나는 스크립트를 수정 한

Can't locate object method "attr" via package "XML::XPathEngine::Literal" at pagegetter.pl line 23. 

을 :

$nodes=$tree->findnodes(q{'//a/@href'}); 

while($node=$nodes->shift) 
{ 
    print $node->attr('href'); 
} 

오류 :

Can't locate object method "shift" via package "XML::XPathEngine::Literal" 

href 속성의 값을 출력하는 방법이 확실하지 않습니다.

$ nodes는 모든 href 속성의 목록을 보유해야합니까? 나는 값을 저장하지 않고 포인터를 대신 사용한다고 믿는다.

나는 검색하고 예제를 읽으려고했지만, 나는 그것에 대해 어떻게 가야할지 모르겠다.

감사합니다.

+0

귀하의 프로그램에 상관없이 * 항상 * '엄격한 사용'을해야합니다. 당신이 사용하기로 선택한 '경고 사용'이 더 중요 할 수 있습니다. – Borodin

답변

4

몇 가지 실수가 있습니다. 수리 :

# list context 
my @nodes = $tree->findnodes(
    q{//a}  # just a string, not a string containings quotes 
); 

# iterate over array 
for my $node (@nodes) { 
+0

'href' 속성을 가진 모든 앵커 요소를 찾으려면'// a [@href]'의 XPath를 사용해야합니다. – Borodin

+0

고마워요. 동의하지만 For 루프 내부에 정확히 무엇을 인쇄합니까? 네, 링크를 추출하고 싶습니까? –

+0

@NeonFlash : 나머지 코드는 그대로 유지됩니다. – Borodin

관련 문제