2012-04-24 23 views
0

我從本網站使用lynx轉儲拉任天堂DS價格。如何使用含有撇號的URL的lynx -dump?

例如,假設我要去從網頁拉的遊戲耀西觸摸&離開:

/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi-Touch-and-Go 

一切正常,我可以使用正則表達式來輕鬆地拉動價格。問題來自URL包含撇號(')或與&符號(&),因爲這會引發錯誤。所以我們可以說我試圖找到遊戲耀西島DS的頁面,我會用這行代碼:

/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS 

這會給我這些小錯誤:

sh: -c: line 0: unexpected EOF while looking for matching `'' 
sh: -c: line 1: syntax error: unexpected end of file 

下面是代碼我用$fullURL作爲包含「http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS」的字符串來調用轉儲。

$command  = "/usr/bin/lynx -dump -width=150 $fullURL"; 
@pageFile = `$command`; 

誰能幫我找到一個解決方案,將會把$fullURL字符串轉換爲URL兼容的字符串?

+1

很多人想看看[LWP](http://p3rl.org/LWP)和[LWP :: Simple](http://p3rl.org/LWP::Simple)以獲得更好的方法一個網頁的內容比使用shell調用'lynx'。 – 2012-04-24 19:31:37

+0

我一定會記住這一點。我正在爲我的perl類中的最終項目製作一個DS價格檢查器程序,並且我們在本學期的早些時候完成了一項任務,它使用了使用lynx來轉儲頁面內容的相同方法。這就是爲什麼我也爲這個項目保持同樣的方法。我剛剛完成了它,它運行良好,雖然效率不高,需要一段時間來處理所有的遊戲。謝謝你的想法! :) – Nick 2012-04-24 20:30:22

回答

3

在將URL傳遞到shell之前,您需要在URL中轉義'。 Perl提供quotemeta函數來爲大多數shell執行所需的轉義。

my $quoted_URL = quotemeta($fullURL); 
$command  = "/usr/bin/lynx -dump -width=150 $quoted_URL"; 
... 

您還可以使用\Q\E逃逸字符串中的相同的結果。

$command  = "/usr/bin/lynx -dump -width=150 \Q$fullURL\E"; 
... 
+0

完美!就像它應該那樣工作!謝謝! – Nick 2012-04-24 19:40:21

+1

'quotemeta'和'\ Q'是用於引用正則表達式,而不是shell字符! – daxim 2012-04-24 21:49:29

1

來處理這個問題的正確方法是使用system /管open(更換QX /反引號操作符)的列表形式,以避免外殼,看到Perl equivalent of PHP's escapeshellarg

use autodie qw(:all); 
open my $lynx, '-|', qw(/usr/bin/lynx -dump -width=150), $fullURL; 
my @pageFile = <$lynx>; 
close $lynx; 

在罕見的情況下,這是不實際的,適當的shell引用通過String::ShellQuoteWin32::ShellQuote提供。

+0

只是出於好奇,爲什麼使用shell從URL中拉得太糟糕? – Nick 2012-04-25 00:52:02

+0

問題必須是,爲什麼你應該避免使用shell,而不用進一步解釋就將參數傳遞給execve系統調用?它更高效:每次啓動程序都可以節省一個進程。這更安全:您可以消除整個類別的注入漏洞。它更強大:諸如'''或'&'這樣的字符不需要特殊處理。 – daxim 2012-04-25 06:54:07