Perl Вопрос с UserAgent Получить сайт на петле - PullRequest
1 голос
/ 12 января 2011

Я могу нормально захватить первое изображение, но затем содержимое кажется зацикленным внутри себя. Не уверен, что я делаю не так.

#!/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");
        }
}

Ответы [ 3 ]

1 голос
/ 13 января 2011

Как уже говорили другие, это действительно работа для HTML :: Parser. Кроме того, вы должны 'использовать строгий;' и удалите use LWP :: Simple, поскольку вы не используете библиотеку.

Вы можете изменить свое регулярное выражение на следующее:

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

Но вы не получите style_medals / comp_graphics_10.gif - это может быть тем, что вы хотите. Я думаю, что-то вроде следующего будет работать лучше. Приношу свои извинения за изменения стиля, но я не могу удержаться от изменения PBP.

#!/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 голос
/ 12 января 2011

Проблема возникает в вашем регулярном выражении. (.*) является жадным, в котором он будет соответствовать всем символам от style_medals/ до $id2.gif. Когда $id2 равно 1, это нормально, но когда $id2 равно 2, оно будет соответствовать всему до 2.gif, включая полную строку из 1.gif.

Попробуйте сделать (.*) нежадным, добавив ? не жадный модификатор: (.*?). Это должно исправить вашу проблему.

Редактировать: В идеале вы бы не использовали регулярное выражение для анализа HTML , вместо этого использовали бы что-то вроде, скажем, HTML::Parser.

0 голосов
/ 16 февраля 2011

Я не буду вставлять модуль синтаксического анализа HTML (хотя LinkExtor может быть вашим другом здесь ...), поскольку я понимаю проблемы, которые могут возникнуть с анализаторами HTML: если HTML-код работает неправильнодействительно, они часто задыхаются, когда простое регулярное выражение может добиться цели на что угодно, независимо от того, насколько сломан, если вы ищете правильную вещь.

Как было сказано выше CanSpice, (. *)жадныйНежадный модификатор обычно делает то, что вы хотите.Однако, другой вариант - позволить ему быть жадным, но убедитесь, что он ничего не захватывает после указанного в кавычках атрибута src тега image:

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

Примечание: я также изменил его, чтобы ему было все равноатрибут alt.Однако я не знаком с сайтом, с которого вы что-то захватываете.

Если это сгенерированный код, все будет хорошо, если они не изменят что-либо в большом масштабе.Но чтобы избежать этой непредвиденной ситуации, даже если не использовать надлежащий HTML-парсер, вы можете написать мини-парсер только для тегов изображения - извлеките теги изображения в ключи хэша (захватите их с помощью регулярного выражения, например / <\ s * (img \ s + [^>] ) \ s > / ), а затем для каждого ключа в хэше (использование хэша позволяет избежать дублирования), а затем прочитать все в кавычкахв отдельное хранилище и замените указанные значения в кавычках, чтобы удалить все пробелы внутри кавычек, затем разделите их на атрибуты в пустом пространстве (с элементом 0 будет тэг, а остальные будут атрибутами, которые вы разделите на значения в =, получая только что полученные значенияхранится мгновение назад (или обрабатывается как что-то вроде '0E0', когда они не имеют значения - таким образом, сохраняя их истинными, но фактически бесполезными)

Однако, если это рукописный код, вы можете столкнуться с некоторымикошмары, потому что многие люди не согласны с использованием кавычек в атрибутах, если они вообще их используют.

...