2013-11-22 74 views
0

我有downlaods一個網頁,然後腳本解析下來到 這樣Perl的WWW ::機械化 - 解析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 

正則表達式很好。

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和未格式化請this pastebucket的HTML代碼。

+0

沒有看到您正在處理的確切輸入,這很難提供幫助。在上一個代碼塊中,您使用文件測試了正則表達式;請發佈該文件的內容,而不是一堆可能與您的真實問題無關的WWW :: Mechanize代碼。如果你創建一個簡單的,獨立的例子,它將更容易調試,並且你可能會得到更快的答案(如果你沒有在流程中找到它)。 – 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