2013-11-22 3 views
0

У меня есть сценарий, который downlaods веб-страницы, а затем разбирает, что вплоть до список URL-адресов, как этотPerl WWW :: Mechanize - разбор HTML в основной доклад

<A HREF="wonk?IssuePage&SolutionId=8&RecordId=20193&Template=view&TableId=1023"><B>26165</B></A> 
<A HREF="wonk?IssuePage&SolutionId=8&RecordId=22163&Template=view&TableId=1023"><B>29327</B></A> 
<A HREF="wonk?IssuePage&SolutionId=8&RecordId=22216&Template=view&TableId=1023"><B>29416</B></A> 
<A HREF="wonk?IssuePage&SolutionId=8&RecordId=22238&Template=view&TableId=1023"><B>29450</B></A> 

Я также раздеть их и загрузить URL-билета в массив @url_list, а затем извлечь некоторую информацию из них

#!/usr/bin/perl 
use WWW::Mechanize; 
use LWP; 

my $username = 'casper'; 
my $password = 'casper'; 

my $mech = WWW::Mechanize->new(); 
$mech->cookie_jar(HTTP::Cookies->new()); 
$mech->get('http://ticketmaster/wonk.dll?ReportPage&Template=reports%2Flist&TableId=1023&Target=Query&QueryName=-6&SolutionId=8') || die "can't reach the website $!"; 
$mech->form_name('theform'); 
$mech->field('ttAuthUID' => $username); 
$mech->field('ttAuthPWD' => $password); 
$mech->click('Action'); 

print $mech->save_content(raw_teamtrack); 

open(my $webpage, "<", "raw_teamtrack") || die "cannot open up the out file $!"; 

while (<$webpage>) { 
    chomp; 
    $link = $_; 
    if ($link =~ /<A HREF=\"(wonk.dll\?IssuePage&SolutionId=8&RecordId.*)"/) { 
    push(@url_list, $1); 
    } 
} 

foreach $url (@url_list) { 
    use WWW::Mechanize; 
    use LWP; 
    my $username = 'casper'; 
    my $password = 'casper'; 

    my $mech = WWW::Mechanize->new(); 
    $mech->cookie_jar(HTTP::Cookies->new()); 
    $mech->get("http://ticketmaster/$url") 
     || die "cannot load the ticket page $!"; 
    $mech->form_name('theform'); 
    $mech->field('ttAuthUID' => $username); 
    $mech->field('ttAuthPWD' => $password); 
    $mech->click('Action'); 
    print $mech->save_content(raw_ticket); 
    open(my $ticketpage, "<", "raw_ticket") 
     || die "cannot open up the out file $!"; 

    while (<$ticketpage>) { 
    chomp; 
    if (/<B>Item\sId:\s+?<\/B>(\d{5})/) { 
     $Item_number = $1; 
    } 
    elsif (/<B>Owner:\s<\/B>(.*)<BR>/) { 
     $Owner = $1; 
    } 
    else { 
     $ticket_title =~ /<B>Title:\s<\/B>(.*)/; 
     print "$Item_number $Owner $ticket_title\n"; 
     sleep 1; 
    } 
    } 
} 

проблема заключается в том, что она выводит только номер позиции и поля Владельца; он не распечатывает название билета.

Кроме того, он распечатывает информацию один раз для каждой итерации - для каждой строки HTML в загружаемом билете.

Это происходит со мной все время: мне обычно приходится перемещать петлю из скобки. Это решает его, но, с фундаментальной точки зрения, я не понимаю, зачем его перемещать по внешней стороне цикла. Почему распечатывается для каждой строки HTML, где она сейчас?

Я также не понимаю, почему $owner не распечатывается. Что-то происходит с else? Должен ли я использовать другое заявление if?

26165 George Glass 
26165 George Glass 
26165 George Glass 
26165 George Glass 
26165 George Glass 
26165 George Glass 
26165 George Glass 
26165 George Glass 
29327 George Glass 
29327 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29450 Jimmy Jack 
29753 Herley Lee 
29753 Herley Lee 
29753 Herley Lee 
29753 Herley Lee 
29753 Herley Lee 
29753 Herley Lee 
29753 Herley Lee 
29753 Herley Lee 

regexes are good.

bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /<B>Item\sId:\s+?<\/B>(\d{5})/' | sort -u 
29871 

bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /<B>Owner:\s<\/B>(.*)<BR>/' | sort -u 
Jimmy Jack 
bash-3.00$ 

bash-3.00$ cat /tmp/raw_ticket | perl -nle 'print /<B>Title:\s<\/B>(.*)/' | sort -u 
Trade Capture Prod Shadow - Install software on ushs2 - 11/15/13 
bash-3.00$ 

Я не мог добавить в HTML-код, который я пытаюсь сломать здесь, как это HTML и не форматирования, пожалуйста, проверьте this pastebucket.

+0

Не видя точного ввода, который вы обрабатываете, это трудно помочь. В последнем блоке кода вы проверили свои регулярные выражения с помощью файла; разместите содержимое этого файла, а не кучу WWW :: Механизируйте код, который, вероятно, не связан с вашей реальной проблемой. Если вы создадите простой, автономный пример, его будет намного легче отлаживать, и вы, скорее всего, получите ответ быстрее (если вы не найдете его сами в этом процессе). – ThisSuitIsBlackNot

+1

Я прибрал ваш код Perl, чтобы он был более читабельным, но добавьте 'use strict' и' use warnings' в начале вашей программы и исправьте ошибки, которые вы получаете от этого. Нечестно ожидать от других помощи, если вы не использовали базовые инструменты, предоставляемые Perl. – Borodin

+0

Вы скопировали много своего кода в цикле 'for', включая операторы' use' и настраивая переменные имени пользователя и пароля. Должно быть ясно, что это не нужно делать больше одного раза, и ваш подход больше походит на догадки, чем на четкое мышление. – Borodin

ответ

0

Я подозреваю, что вы сопоставляете шаблоны с операторами if и присваиваете переменную $ 1 (последняя проверка/присвоение регулярного выражения в коде неправильная). Ниже приведено описание тестовых данных для одного примера (так что название билета будет, по крайней мере, напечатано, не уверены в цикле без набора URL-адресов).

Так что я бы соответствовать, как это ...

use strict; 
use warnings; # always use these at top 

....

my $Item_number; 
my $Owner; 
my $ticket_title; 

while (<$webpage>) { 
    my $line = $_; 
    chomp; 
    $line =~ /<B>Item\sId:\s+?<\/B>(\d{5})/ and $Item_number = $1; 
    $line =~ /<B>Owner:\s<\/B>(.*)<BR>/ and $Owner = $1; 
    $line =~ /<B>Title:\s<\/B>(.*)/ and $ticket_title = $1; 
} 
print "$Item_number $Owner $ticket_title\n"; 

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

Чтобы уточнить, как это работает, символы «и» похожи на ярлык, поэтому выполнение задания выполняется только в том случае, если в этом случае регулярное выражение является истинным.

+0

Эй - спасибо, что это был действительно то, что я искал - предложение о лучшей форме. – capser

Смежные вопросы