LWP :: Simple работает очень хорошо: как сохранить 6000 ++ записей в файле и выполнить некоторую очистку? - PullRequest
2 голосов
/ 26 февраля 2011

Добрый вечер, уважаемое сообщество!

Я хочу обрабатывать несколько веб-страниц, вроде веб-паука / сканера.У меня есть несколько битов - но теперь мне нужно немного улучшить логику паука.См. Целевой URL http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50

Обновление:

благодаря двум замечательным комментариям, которые я получил много.Теперь код работает очень хорошо.Последний вопрос: как сохранить данные в файл ... Как заставить синтаксический анализатор записать результаты в файл.Это гораздо удобнее, чем получать более 6000 записей в командной строке ... И если выходные данные делаются в файле, мне нужно выполнить окончательную очистку: см. Выходные данные: если мы сравним все выходные данные с целевым url -тогда уверен, что это нуждается в некоторой очистке, что ты думаешь ?!Снова посмотрите целевой URL http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50

6114,7754,"Volksschule Zeil a.Mai",/Sa,"d a.Mai",(Gru,"09524/94992 09524/94997",,Volksschulen,
6115,7757,"Mittelschule Zeil - Sa","d a.Mai",Schulri,"g 
97475       Zeil","09524/94995
09524/94997",,Volksschulen,"      www.hauptschule-zeil-sand.de"
6116,3890,"Volksschule Zeilar",(Gru,"dschule)
Bgm.-Stallbauer-Str. 8
84367       Zeilar",,"08572/439
08572/920001",,Volksschulen,"      www.gs-zeilarn.de"
6117,4664,"Volksschule Zeitlar",(Gru,"dschule)
Schulstra�e 5
93197       Zeitlar",,"0941/63528
0941/68945",,Volksschulen,"      www.vs-zeitlarn.de"
6118,4818,"Mittelschule Zeitlar","Schulstra�e 5
93197       Zeitlar",,,"0941/63528
0941/68945",,Volksschulen,"      www.vs-zeitlarn.de"
6119,7684,"Volksschule Zeitlofs (Gru","dschule)
Raiffeise","Str. 36
97799       Zeitlofs",,"09746/347
09746/347",,Volksschulen,"      grundschule-zeitlofs.de"

thx для любой информации!нуль!

Здесь старый вопрос: Кажется, работает нормально как часть функции 1-выстрел.Но как только я включаю функцию как часть цикла, она ничего не возвращает ... В чем дело?

Для начала: смотри цель http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50 Эта страницаполучил более 6000 результатов!Ну как мне получить все результаты?Я использую модуль LWP :: simple, и мне нужно иметь некоторые улучшенные аргументы, которые я могу использовать, чтобы получить все 6150 записей ... У меня есть код, который происходит от очень поддерживающего члена tadmic (см. Этот форум) - иэто в основном работает очень хорошо.Но после добавления нескольких строк - (на данный момент) он выдает некоторые ошибки.

Попытка: Вот первые 5 страниц URL:

http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=0 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=50 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=100 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=150 
http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=200

Мы можем видеть, что "s"атрибут в URL-адресе начинается с 0 для страницы 1, а затем увеличивается на 50 для каждой последующей страницы.Мы можем использовать эту информацию для создания цикла:

#!/usr/bin/perl  
use warnings;  
use strict;  
use LWP::Simple;  
use HTML::TableExtract;  
use Text::CSV;  

my @cols = qw(  
    rownum  
    number  
    name  
    phone  
    type  
    website  
);  

my @fields = qw(  
    rownum  
    number  
    name  
    street  
    postal  
    town  
    phone  
    fax  
    type  
    website  
);  

my $i_first = "0";   
my $i_last = "6100";   
my $i_interval = "50";   

for (my $i = $i_first; $i <= $i_last; $i += $i_interval) {   
    my $html = get("http://192.68.214.70/km/asps/schulsuche.asp?q=e&a=50&s=$i");   
    $html =~ tr/r//d;     # strip the carriage returns  
    $html =~ s/&nbsp;/ /g; # expand the spaces  

    my $te = new HTML::TableExtract();  
    $te->parse($html);  

    my $csv = Text::CSV->new({ binary => 1 });  

    foreach my $ts ($te->table_states) {  
        foreach my $row ($ts->rows) {  
            #trim leading/trailing whitespace from base fields  
            s/^s+//, s/\s+$// for @$row;  

            #load the fields into the hash using a "hash slice"  
            my %h;  
            @h{@cols} = @$row;  

            #derive some fields from base fields, again using a hash slice  
            @h{qw/name street postal town/} = split /n+/, $h{name};  
            @h{qw/phone fax/} = split /n+/, $h{phone};  

            #trim leading/trailing whitespace from derived fields  
            s/^s+//, s/\s+$// for @h{qw/name street postal town/};  

            $csv->combine(@h{@fields});  
            print $csv->string, "\n";  
        }  
    } 
}

Я проверил код и получил следующие результаты:

Кстати: здесь строки 57 и 58: ... командная строка говорит, что у меня есть ошибки здесь ..:

    #trim leading/trailing whitespace from derived fields  
        s/^s+//, s/\s+$// for @h{qw/name street postal town/};  

что вы думаете?Отсутствуют ли некоторые обратные слеши !?Как исправить и протестировать код так, чтобы результаты были правильными!?

С нетерпением ожидаю услышать от вас ноль

увидеть ошибки, которые я получаю:

    Ot",,,Telefo,Fax,Schulat,Webseite                                                          Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.                                                                                        "lfd. N.",Schul-numme,Schul,"ame                                                                           
    Sta�e
    PLZ 
    Ot",,,Telefo,Fax,Schulat,Webseite
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
"lfd. N.",Schul-numme,Schul,"ame
    Sta�e
    PLZ 
    Ot",,,Telefo,Fax,Schulat,Webseite
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
Use of uninitialized value $_ in substitution (s///) at bavaria_all_guru.pl line 58.
"lfd. N.",Schul-numme,Schul,"ame

Ответы [ 3 ]

3 голосов
/ 26 февраля 2011

Эта строка не удаляет возврат каретки, как вы говорите:

$html =~ tr/r//d;     # strip the carriage returns  

Вам понадобится:

$html =~ tr/\r//d;     # strip the carriage returns

А может быть, даже:

$html =~ tr/\r\n//d;     # strip the carriage returns  
3 голосов
/ 26 февраля 2011

Всякий раз, когда $_ равен undef и происходит замещение, связанное с этим, появляются эти предупреждения.s/// конструкция неявно работает на $_.Решение состоит в том, чтобы проверить, если defined перед попыткой подстановки.

Помимо этого, хотя и не связано с предупреждениями, в вашем регулярном выражении есть логическая ошибка:

s/^s+//, s/\s+$// for @h{qw/name street postal town/};

Обратите внимание на отсутствующий \ в первой конструкции.

Устранение ошибки и упрощение:

defined and s{^ \s+ | \s+ $}{}gx for @h{qw/name street postal town/};

Для вывода в файл добавьте следующее перед циклом for:

open my $fh, '>', '/path/to/output/file' or die $!;

Заменить:

print $csv->string, "\n";

на:

print $fh $csv->string, "\n";

Это синтаксическое изменение с print LIST на print FILEHANDLE LIST.

См .:

1 голос
/ 26 февраля 2011

Если вы пытаетесь извлечь ссылки со страниц, используйте WWW :: Mechanize, который является оберткой для LWP и правильно анализирует HTML, чтобы получить ссылки для вас, а также множество других удобных вещей для людей, которые ищут информацию.веб-страницы.

...