【问题标题】:How do I use lynx -dump with URLs that contain apostrophes?如何将 lynx -dump 与包含撇号的 URL 一起使用?
【发布时间】:2012-04-24 19:06:18
【问题描述】:

我正在使用 lynx -dump 从该网站拉取 Nintendo DS 价格。

例如,假设我要从网页拉取游戏 Yoshi Touch and Go:

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

一切正常,我可以使用正则表达式轻松拉出价格。当 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”的字符串。

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

谁能帮我找到将$fullURL 字符串转换为URL 兼容字符串的解决方案?

【问题讨论】:

  • 很多人都想看看LWPLWP::Simple 以获得比使用shell 调用lynx 更好的方法来获取网页内容。
  • 我一定会牢记这一点。我正在为我的 perl 课程的一个期末项目制作一个 DS 价格检查程序,我们在本学期早些时候完成了一项作业,该作业使用与使用 lynx 转储页面内容相同的方法。这就是为什么我也为这个项目保留了相同的方法。我刚刚完成了这一切,它运行良好,虽然效率不高,并且需要一段时间来处理所有游戏。不过谢谢你的主意! :)

标签: regex perl url


【解决方案1】:

您需要先将 URL 中的 ' 转义,然后才能将其传递给 shell。 Perl 提供了 to 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";
...

【讨论】:

  • quotemeta\Q 用于引用正则表达式,而不是 shell 字符!
【解决方案2】:

处理这个问题的正确方法是避开shell,使用system/pipeopen的列表形式(替换qx/backtick运算符),见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::ShellQuoteWin32::ShellQuote 提供正确的shell 引用。

【讨论】:

  • 只是出于好奇,为什么使用 shell 从 URL 中提取这么糟糕?
  • 问题一定是,为什么你宁愿避免使用shell,而是将参数传递给execve系统调用而不做进一步解释?它更高效:每次启动程序都可以节省一个进程。它更安全:您消除了整个 shell 注入错误。它更健壮:'&amp; 等字符不需要特殊处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多