2011-01-12 4 views
1

첫 번째 이미지를 잘 포착 할 수 있지만 내용 자체가 반복되는 것 같습니다. 내가 뭘 잘못하고 있는지 모르겠다.UserAgent의 Perl 질문 루프에서 웹 사이트 가져 오기

#!/usr/bin/perl 
use LWP::Simple; 
use LWP::UserAgent; 
my $ua = LWP::UserAgent->new; 
for(my $id=1;$id<55;$id++) 
{ 
    my $response = $ua->get("http://www.gamereplays.org/community/index.php?act=medals&CODE=showmedal&MDSID=" . $id); 
    my $content = $response->content;  
     for(my $id2=1;$id2<10;$id2++) 
     { 
       $content =~ /<img src="http:\/\/www\.gamereplays.org\/community\/style_medals\/(.*)$id2\.gif" alt=""\/>/; 
       $url = "http://www.gamereplays.org/community/style_medals/" . $1 . $id2 . ".gif"; 
    print "--\n\r"; 
    print "ID: ".$id."\n\r"; 
    print "ID2: ".$id2."\n\r"; 
    print "URL: ".$url."\n\r"; 
    print "1: ".$1."\n\r"; 
    print "--\n\r"; 
    getstore($url, $1 . $id2 . ".gif"); 
     } 
} 
+0

질문을 완전히 이해하지 못했습니다. 그것은 무한 루프에 갇혀 있습니까? 또한 LWP :: Simple 및 LWP :: UserAgent를 사용할 필요가 없다고 생각합니다. 당신은 단지 LWP는 여기에 간단한 – Cfreak

+0

을 :: 출력의 예입니다 필요 http://pastebin.com/WMy5wYWM - 나는 그것을 콘텐츠 + = 내용과 같은 의미에서 동일한 콘텐츠를 사용하고있는 것으로 보인다 말을 의미 – NikkiW

답변

1

다른 사람들이 말한 것처럼, 이것은 HTML :: Parser의 작업입니다. 또한 '엄격한;을 사용해야합니다.' 라이브러리를 사용하지 않으므로 LWP :: Simple을 제거하십시오.

다음에 정규식을 변경할 수 있습니다 :

$content =~ m{http://www\.gamereplays\.org/community/style_medals/([\w\_]+)$id2\.gif}s; 

하지만 당신은 style_medals/comp_graphics_10.gif을받지 않습니다 - 당신이 원하는 것을 할 수있다. 나는 다음과 같은 것이 더 효과적 일 것이라고 생각한다. 스타일 변경에 대해 사과하지만 PBP 수정을 거부 할 수는 없습니다. 나는 HTML 파서와 함께 할 수있는 문제를 이해

#!/usr/bin/perl                 

use LWP::UserAgent; 
use Carp; 
use strict; 

my $ua = LWP::UserAgent->new(); 

# Fetch pages from 1 to 55. Are we sure we won't have page 56?     
# Perhaps consider running until a 404 is found.         
for (my $id = 1; $id < 55; $id++) { 

    # Get the page data               
    my $response = $ua->get('http://www.gamereplays.org/community/index.php?ac\ 
t=medals&CODE=showmedal&MDSID='.$id); 

    # Check for failure and abort            
    if (!defined $response || !$response->is_success) { 
     croak 'Request failed! '.$response->status_line(); 
    } 

    my $content = $response->content(); 

    # Run this loop each time we find the url         
    CONTENT_LOOP: 
    while ($content =~ s{<img src="(http://www\.gamereplays\.org/community/styl\ 
e_medals/([^\"]+))" }{}ms) { 

     my $url = $1; # The entire url, no need to recreate the domain  
     my $file = $2; # Just the file name portion       
     my ($id2) = $file =~ m{ _(\d+)\.gif \Z}xms; # extract id2 for debug  

     next CONTENT_LOOP if !defined $id2;   # Handle SOTW.gif file(s) 

     # Display stats about each id found          
     print "--\n"; 
     print "ID: $id\n"; 
     print "ID2: $id2\n"; 
     print "URL: $url\n"; 
     print "1: $file\n"; 
     print "--\n"; 

     # You might want to consider involving the $id in the filename as  
     # you could have the same filename on multiple pages      
     getstore($url, $file); 
    } 
} 
1

문제는 정규 표현식에 있습니다. (.*)은 욕심이 많으며 style_medals/$id2.gif 사이의 모든 문자와 일치합니다. $id2이 1 일 때이 값은 유효하지만 $id2이 2 일 때 1.gif의 전체 문자열을 포함하는 2.gif까지 모든 값이 일치합니다.

시도 ? 비 욕심 수정 추가하여 비 욕심 (.*)을 : (.*?)합니다. 이렇게하면 문제가 해결됩니다.

편집 : HTML::Parser과 같은 것을 사용하는 대신 regular expression to parse HTML을 사용하지 않는 것이 가장 좋습니다.

+0

내가 들여다 탐욕과 Ungreedy 일치 및 나는 당신이 의미하는 것을 참조하십시오. 그러나, 나는 여전히 같은 문제가 있습니다. RegEx를 미세 조정해야합니까? 현실적으로 당신이 대신 HTML 파서를 사용하도록 코드를 다시 작성해야 – NikkiW

+0

, 각 이미지를 통해 다음 루프 파서는 발견했다. – CanSpice

0

나는 HTML 구문 분석 모듈을 밀어하지 않습니다 (LinkExtor 하지만 ... 여기 당신의 친구가 될 수 있습니다) 다음 HTML이 제대로되지 않으면 유효한, 그들은 종종 당신이 옳은 일을 찾고있는 한 단순한 정규 표현식이 아무리해도 깨진 것이 무엇이든간에 그 트릭을 할 수있는 곳에서 종종 질식합니다.

위에서 언급 한 것처럼 CanSpice (. *)는 욕심이 많습니다. 비 탐욕적 수정자는 보통 당신이 원하는 것을 할 것입니다. 그러나 또 다른 옵션은 욕심을 할 수 있지만, 이미지 태그의 인용 src 속성을지나 아무것도 잡아하지 않도록하는 것입니다

/<img src="http:\/\/www\.gamereplays.org\/community\/style_medals\/([^"]*)$id2\.gif"[^>]*>/ 

참고 : 나는 또한 고도가 있다면 걱정하지 그것을 수정 속성. 그러나, 나는 당신이 물건을 움켜 잡고있는 사이트에 익숙하지 않다.

코드가 생성 된 경우 큰 규모로 변경하지 않는 한 괜찮습니다.그러나 적절한 HTML 구문 분석기를 사용하지 않아도 우발적 인 상황을 피하기 위해 직접 이미지 태그 용 미니 파서를 작성하는 것이 좋습니다. 해시 키에 이미지 태그를 추출합니다 (/< \ S * (IMG의 \ S + [^>] ) \ S>/)의 해시를 사용하여 해시를 각 키() 속는을 방지를위한 후 다음 별도의 스토리지에 인용 내부 모두 읽어 인용 된 값을 대체 따옴표 안에있는 공백을 제거한 다음 공백에있는 속성으로 분할합니다 (요소 0은 태그 이름이고 나머지는 =에 값으로 분리되는 속성이며 잠시 전에 저장 한 값을 되찾거나 값이없는 '0E0'과 같아서 사실이지만 가치가없는 값을 유지합니다.

그러나 필기 코드 인 경우 많은 사람들이 속성을 사용하는 경우 속성에 따옴표를 사용하는 것과 일관성이 없기 때문에 악몽을 피할 수 있습니다.

+0

진술 : mheckman : 너는 [\ w \ _] 중복되어 있다는 것을 알고 있니? \ w는 같은 것을 의미합니다. "\ W는 단지 [0-9A-ZA-Z_]뿐만 아니라 비 로마 스크립트에서 숫자와 문자를 단어 문자 (숫자 또는 _), 일치"를 – Dodger

관련 문제