我使用lynx -dump从本网站提取任天堂DS价格。
例如,假设我要从Yoshi Touch and Go游戏的网页上拉出来:
/usr/bin/lynx -dump -width=150 http://videogames.pricecharting.com/game/nintendo-ds/Yoshi-Touch-and-Go
一切正常,我可以使用Regex轻松提价。问题来自于URL包含撇号(')或&符号(&),因为它会引发错误。所以,假设我试着找到游戏Yoshi's Island 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
以下是我用来调用-dump的代码,其中$fullURL
是包含以下内容的字符串:“http://videogames.pricecharting.com/game/nintendo-ds/Yoshi's-Island-DS”。< / p>
$command = "/usr/bin/lynx -dump -width=150 $fullURL";
@pageFile = `$command`;
有人可以帮我找到一个解决方案,将$fullURL
字符串变成与URL兼容的字符串吗?
答案 0 :(得分: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";
...
答案 1 :(得分:1)
处理此问题的正确方法是使用system
/ pipe open
的列表形式(替换qx / backtick运算符)来避免shell,请参阅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;
在极少数情况下,这是不切实际的,通过String::ShellQuote和Win32::ShellQuote提供正确的shell引用。