2012-03-12 5 views
1

나는 1184에서 1325 행의 http://www.soccerbase.com/tournaments/tournament.sd?comp_id=1에서 정보를 긁어 내려고합니다. 근본적으로 앞으로 7 일 동안 계속 될 게임입니다. 단일 인스턴스에서 작동하는 코드가 있지만 코드를 반복하는 방법을 알아낼 수 없으므로 7 일간의 게임이 끝날 때까지 모든 게임 정보를 다 찰 것이다. 특정 태그 또는 뭔가를 때릴 때까지 내가 긁을 수있는 일종의 루프가 있습니까? 지금까지 내 코드가 있습니다, 미리 감사드립니다!WWW :: Mechanize and iteration

my $page = WWW::Mechanize->new; 

$page->get('http://www.soccerbase.com/tournaments/tournament.sd?comp_id=1'); 

my $stream = HTML::TokeParser->new(\$page->{content}); 
my @fixture; 
my $tag = $stream->get_tag("td"); 
while($tag->[1]{class} ne "dateTime"){ 
    $tag = $stream->get_tag("td"); 
} 

if ($tag->[1]{class} eq "dateTime") { 
    push(@fixture, $stream->get_trimmed_text("/a")); 
} 

$stream->get_tag("a"); 
$stream->get_tag("a"); 
push(@fixture, $stream->get_trimmed_text("/a")); 

$stream->get_tag("a"); 
push(@fixture, $stream->get_trimmed_text("/a")); 

foreach $element (@fixture){ 
print $element, "\t"; 
} 
print "\n"; 

답변

3

HTML을 구문 분석 Web::Query을 시도, 그것은 TokeParser보다 사용하기 훨씬 좋네요입니다. 그것은 명령형 대신 선언적으로 작동하며 CSS 표현식을 사용하여 요소를 선택합니다.

점수가 v 인 경우 결과 집합에 행을 추가하고 그렇지 않으면 행을 삭제합니다.

use Web::Query 'wq'; 
my $football_matches = wq($mech->content) 
    ->find('tr.match') 
    ->map(sub { 
     my (undef, $e) = @_; 
     return 'v' eq $e->find('td.score')->text 
      ? [ 
       $e->attr('id'), 
       map { $e->find("td.$_")->text } 
        (qw(tournament dateTime homeTeam score awayTeam prices)) 
      ] 
      :(); 
    }); 
use Data::Dumper; print Dumper $football_matches; 

$VAR1 = [ 
    ['tn7gc635476', '', ' Mo 12Mar 2012 ', 'Arsenal', 'v', 'Newcastle', ' '], 
    ['tn7gc649937', '', ' Tu 13Mar 2012 ', 'Liverpool', 'v', 'Everton', ' '], 
    ['tn7gc635681', '', ' Sa 17Mar 2012 ', 'Fulham', 'v', 'Swansea', ' '], 
    ['tn7gc635661', '', ' Sa 17Mar 2012 ', 'Wigan',  'v', 'West Brom', ' '], 
    ['tn7gc635749', '', ' Su 18Mar 2012 ', 'Wolves', 'v', 'Man Utd', ' '], 
    ['tn7gc635556', '', ' Su 18Mar 2012 ', 'Newcastle', 'v', 'Norwich', ' '] 
]; 
+0

덕분에 너무 많은이 완벽하게 작동합니다. 만약 당신이 신경 쓰지 않는다면, 위의 구조에서 팀 이름과 날짜를 추출하여 정상적인 문자열 변수에 넣을 수 있습니까? 다시 한 번 감사드립니다! – blacky

+1

해당 주제에 대한 [새 질문 열기] (http://stackoverflow.com/questions/ask) – daxim

+0

나는 그렇게했다! – blacky

관련 문제