WWW :: Mechanize :: Firefox - почти все - только небольшая ошибка регулярного выражения - PullRequest
0 голосов
/ 27 марта 2012

Ну, для меня Perl иногда выглядит как Abracadabra Огромное спасибо за терпение со мной ...

обновление; были некоторые ошибки до тех пор, пока пользователь 1269651 и Бодойн не предложили исправление

см. Результаты кода bodoins .. (обратите внимание, что он однажды изменил код - я использовал здесь самую первую версию ...:;

linux-wyee:/home/martin/perl # perl test_7.pl
http://www.unifr.ch/sfm
http://www.zug.phz.ch
http://www.schwyz.phz.ch
http://www.luzern.phz.ch
http://www.schwyz.phz.ch                                                                   http://www.phvs.ch                                                                         http://www.phtg.ch                                                                         http://www.phsg.ch                                                                         http://www.phsh.ch                                                                         Use of uninitialized value $png in print at test_7.pl line 25, <$urls> line 10.                                                                                        http://www.phr.ch                                                                          http://www.hepfr.ch/
http://www.phbern.ch
http://www.ph-solothurn.ch
http://www.pfh-gr.ch
Got status code 500 at test_7.pl line 14
linux-wyee:/home/martin/perl # 

и последняя версия кода bodins - некоторые результаты выглядят так ...

Can't call method "addProgressListener" on an undefined value at /usr/lib/perl5/site_perl/5.14.2/WWW/Mechanize/Firefox.pm line 566, <$urls> line 12.

ну, осталось несколько мелких вещей - см. Выше ... что мы можем сделать с этими маленькими ошибками ... кстати: как насчет идеи хранить результаты в папке. .. / (называемые изображениями или около того!?)

конец обновления ...

здесь начинается начальная нить - и дается план того, что нужно:

мне нужно иметь несколько миниатюр с веб-сайтов, но я попытался использовать wget - но это не работает для меня, так как мне нужны некоторые функции рендеринга, что нужно: у меня есть список из 2500 URL-адресов, по одному в каждой строке, сохраненный в файле. Затем я хочу сценарий - см. Ниже - чтобы открыть файл, прочитать строку, затем получить веб-сайт и сохранить изображение в виде небольшого эскиза.

хорошо, так как у меня есть куча веб-сайтов (2500), я должен определиться с именами результатов.

http://www.unifr.ch/sfm
http://www.zug.phz.ch
http://www.schwyz.phz.ch
http://www.luzern.phz.ch
http://www.schwyz.phz.ch
http://www.phvs.ch
http://www.phtg.ch
http://www.phsg.ch
http://www.phsh.ch
http://www.phr.ch
http://www.hepfr.ch/
http://www.phbern.ch

Пока все хорошо, я думаю, что попробую что-то вроде этого

Мы также должны закрыть обработчик файлов, если он нам больше не нужен. Помимо этого мы можем использовать «или умереть» на открытии. я сделал это - см. ниже!

Кстати, нам нужно хорошее имя файла. Так как у меня есть огромный список URL-адресов, я получаю огромный список выходных файлов. Поэтому мне нужно иметь хорошие имена файлов. Можем ли мы отразить эти вещи и потребности в программе!?

скрипт вообще не запускается ....

#!/usr/bin/perl

use strict;
use warnings;
use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open(INPUT, "<urls.txt") or die $!;

while (<INPUT>) {
        chomp;
        next if $_ =~ m/http/i;
        print "$_\n";
        $mech->get($_);
        my $png = $mech->content_as_png();
        my $name = "$_";
        $name =~s#http://##is;
        $name =~s#/##gis;$name =~s#\s+\z##is;$name =~s#\A\s+##is;
        $name =~s/^www\.//;
        $name .= ".png";
        open(my $out, ">",$name) or die $!;
        binmode($out);
        print $out $png;
        close($out);
        sleep (5);
}

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Я придумал это:

while (my $name = <DATA>) {
        chomp ($name) ;

        #$mech->get($_);
        #my $png = $mech->content_as_png();
        $name =~ s#http://##;  #REMOVE THIS LINE

        $name =~s#/#-#gis;
        $name =~s#\s+\z##is;$name =~s#\A\s+##is;

        $name =~s/^www\.//;

        $name .= ".png";

        print $name . "\n\n";   #REMOVE THIS LINE       
        #open(my $out, ">",$name) or die $!;
        #binmode($out);
        #print $out $png;
        #close($out);
        #sleep (5);
}


__DATA__
http://www.unifr.ch/sfm
http://www.zug.phz.ch
http://www.schwyz.phz.ch
http://www.luzern.phz.ch
http://www.schwyz.phz.ch
http://www.phvs.ch
http://www.phtg.ch
http://www.phsg.ch
http://www.phsh.ch
http://www.phr.ch
http://www.hepfr.ch/
http://www.phbern.ch

Вы должны иметь возможность изменить его для своих нужд, я прокомментировал все, кроме материала регулярных выражений.Я также изменил одно регулярное выражение, чтобы заменить '/' на '-', чтобы уменьшить вероятность ложного создания дубликатов URL.

Так что http://www.unifr.ch/sfm будет выглядеть так: unifr.ch-sfm

Надеюсь, это поможет

1 голос
/ 28 марта 2012

Есть ряд проблем с вашим кодом. Наиболее значимой является линия

next if $_ =~ m/http/i;

, который отбрасывает все строки из urls.txt, содержащие http, что не то, что вы хотите.

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

use strict;
use warnings;

use WWW::Mechanize::Firefox;

my $mech = new WWW::Mechanize::Firefox();

open my $urls, '<', 'urls.txt' or die $!;

while (<$urls>) {
  chomp;
  next unless /^http/i;
  print "$_\n";
  $mech->get($_);
  my $png = $mech->content_as_png;
  my $name = $_;
  $name =~ s#^http://##i;
  $name =~ s#/##g;
  $name =~ s/\s+\z//;
  $name =~ s/\A\s+//;
  $name =~ s/^www\.//;
  $name .= ".png";
  open my $out, ">", $name or die $!;
  binmode $out;
  print $out $png;
  close $out;
  sleep 5;
}
...