【问题标题】:LWP not workingLWP 不工作
【发布时间】:2015-04-15 14:06:09
【问题描述】:

我已经用我自己的表达方式进行了尝试,让它与我的项目一起工作。但是在网上看了几个小时后,我仍然无法正常工作。 尝试下面的代码(不是我的),但它只会产生“死”语句。我自己的代码(这里有另一个问题)只返回“按任意键..”我做错了什么?

#!/usr/bin/perl -w
# cookbook-rank - find rank of Perl Cookbook on Amazon

use LWP::Simple;

my $html = get("http://www.amazon.com/exec/obidos/ASIN/1565922433")
  or die "Couldn't fetch the Perl Cookbook's page.";
$html =~ m{Amazon\.com Sales Rank: </b> ([\d,]+) </font><br>} || die;
my $sales_rank = $1;
$sales_rank =~ tr[,][]d;    # 4,070 becomes 4070
print "$sales_rank\n";

【问题讨论】:

  • 您在运行此脚本时得到的确切错误信息是什么?
  • 请将错误消息复制/粘贴为文本。图片链接很烦人。
  • 用正则表达式解析 HTML 是一场失败的游戏。格式上的微小更改可能会破坏您的代码,这就是这里发生的情况。您真正想要的是一个 HTML 解析器,并使用 XPath 通过 ID 查找您想要的元素(这里是 #SalesRank)。那是another question which has already been answered。更好的是,您应该使用 API(如果可用),而不是抓取缓慢且容易更改的页面。

标签: regex perl


【解决方案1】:

die 发生在下载的内容不包含任何与正则表达式匹配的文本时。 LWP 或代码本身没有任何问题,只是假设下载会匹配。 (不过,die 声明最好包含对出错原因的解释。)

【讨论】:

  • @SinanÜnür 您能否提供您编辑的理由?我对那段文字的措辞不是很满意,但我不确定完全删除它是正确的解决方案。
  • 只是我手机的浏览器。我猜它不支持这种特殊的重定向。谢谢你的解释。
【解决方案2】:

自编写该示例以来,Amazon HTML 似乎发生了变化。该页面不再包含字符串“Amazon.com Sales Rank”。相反,它现在显示“亚马逊畅销书排名:”。

但是您需要查看页面的 HTML 源代码。出于某种原因,亚马逊在该标签和包含实际销售排名的行之间插入了 30 多个空白行。

总而言之,这是一个很好的例子,说明了为什么屏幕抓取是一个坏主意。建议您使用亚马逊的产品 API 会更好。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 2011-09-24
    • 2016-09-05
    • 2010-12-20
    相关资源
    最近更新 更多