【发布时间】:2011-07-15 18:25:00
【问题描述】:
我正在尝试使用 Perl API 从网站中提取数据。我正在使用 URI 列表从网站获取数据。
最初的问题是,如果 URI 没有可用数据,它就会死掉,我希望它跳过那个特定的 URI 并转到下一个可用的 URI。我用next unless ....; 来解决这个问题。
现在的问题是我试图通过调用 API 中的特定方法(称为 identifiers())从 Web 中提取特定数据。现在数据可用于 URI,但我正在寻找的特定数据(标识符)不可用并且它死了。
我尝试像这样使用 eval{}
eval {
for $bar ($foo->identifiers()){
#do something
};
}
当我使用 eval{} 时,我认为它会跳过错误并继续前进,但我不确定。因为它给出的错误是“Invalid content type in response:text/plain”。
虽然我手动检查了 URI,但它没有标识符,但它具有其余数据。我希望它跳过并移至下一个 URI。我该怎么做?
我收到了一位专家的回复: 当 Perl 遇到错误时,就像大多数语言一样,它会依次遍历调用上下文,直到找到可以处理错误的地方。 Perl 最基本的错误处理是 eval{} (但如果可以的话,我会使用 Try::Tiny,因为这样更清楚你正在处理错误而不是 eval 可以做的其他一些奇怪的事情)。 无论如何,当 Perl 命中 eval{} 时,整个 eval{} 退出,并且 $& 被设置为错误。因此,将 eval{} 置于循环之外意味着错误将离开循环。如果将 eval{} 放入循环中,当发生错误时,eval{} 将退出,但您将继续进行下一次迭代。就这么简单。
但实际上我得到的错误是响应中的内容类型无效:mycode 第 41 行的 text/html 和我的代码(我的程序)中的第 41 行实际上是来自网络的数据。我知道代码中没有错误,因为它适用于以前的 uri。现在,我该如何解决这个错误并继续下一个 uri?我的程序卡在这个错误上。
【问题讨论】:
-
注意基于stackoverflow.com/questions/6693259/… 下的其他讨论:这不是直接使用 LWP::UserAgent,而是仅接受 XML 内容类型的 Connotea Perl API。上面的错误来自 Connotea Perl,而不是 LWP::UserAgent
-
@morungos。感谢您的回复,我很抱歉重复这个问题两次,我已经熟悉了 stackoverflow。好吧,我正在玩我的代码来获取标签。我在我的代码行周围使用了 eval 来获取标签。在整个代码中使用 eval 意味着什么?你能详细说明一下吗?谢谢萨米德
-
建议编辑问题中的代码以显示更多上下文,目前我们无能为力
-
@morungos。好吧,我没有得到你。你的意思是贴代码。这是我正在使用的代码的 sn-p 以及它卡在
while (<IN0>) { my $currentURI = $_; chomp($currentURI); my @tags = $c->posts_for(uri =>"$currentURI");的位置,我的@tags 行出现错误。
标签: perl api data-mining