我有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代碼。
沒有看到您正在處理的確切輸入,這很難提供幫助。在上一個代碼塊中,您使用文件測試了正則表達式;請發佈該文件的內容,而不是一堆可能與您的真實問題無關的WWW :: Mechanize代碼。如果你創建一個簡單的,獨立的例子,它將更容易調試,並且你可能會得到更快的答案(如果你沒有在流程中找到它)。 – ThisSuitIsBlackNot
我已經整理好了你的Perl代碼,使它更具可讀性,但請在程序開始時添加'use strict'和'use warnings',並修復從中得到的錯誤。當你沒有使用Perl提供的基本工具時,期待他人的幫助是不公平的。 – Borodin
您已經在'for'循環中複製了很多代碼,包括'use'語句以及設置用戶名和密碼變量。應該清楚的是,這不需要多做一次,而且你的方法看起來更像猜測而非清晰的想法。 – Borodin