在Ebay RSS feed中读取自定义值(XML :: RSS模块)

时间:2010-06-02 16:11:47

标签: perl rss parsing feed ebay

我花了太长时间试图解决这个问题。我正在使用XML:RSS和Perl来读取/解析Ebay RSS提要。在该区域内,我看到这些条目:

<rx:BuyItNowPrice xmlns:rx="urn:ebay:apis:eBLBaseComponents">1395</rx:BuyItNowPrice>
<rx:CurrentPrice xmlns:rx="urn:ebay:apis:eBLBaseComponents">1255</rx:CurrentPrice>

然而,我无法弄清楚如何在循环中抓取细节。我写了一个正则表达式来抓住它们:

@current_price = $item  =~ m/\<rx\:CurrentPrice.*\>(\d+)\<\/rx\:CurrentPrice\>/g;

如果您将上述“CurrentPrice”条目放入独立字符串中,但在脚本正在读取RSS源时,则无效。

我可以从项目&gt;描述区域(#出价,拍卖结束时间,BIN价格,缩略图等)中获取我想要的大部分信息,但如果我能从中获取信息会更好在没有我必须处理手动抓取所有信息的情况下。

如果有人知道如何从RSS提要中获取自定义字段(没有编写正则表达式来解析整个提要与模块),那么任何帮助/见解都将受到赞赏。

这是我正在使用的代码:

$my_limit = 0;
use LWP::Simple;
use XML::RSS;

$rss = XML::RSS->new();
$data = get( $mylink );
$rss->parse( $data );

$channel = $rss->{channel};

$NumItems = 0;
foreach  $item (@{$rss->{'items'}}) {
if($NumItems > $my_limit){
last;
}

@current_price = $item =~ m/\<rx\:CurrentPrice.*\>(\d+)\<\/rx\:CurrentPrice\>/g;

print "$current_price[0]";

}

2 个答案:

答案 0 :(得分:1)

如果您有rss / xml文档并想要特定数据,可以使用XPATH:

Perl CPAN XPATH

XPath Introduction

答案 1 :(得分:0)

RSS Feed中“它不起作用”的方式是什么?如果有比赛,你的意思是没有比赛吗?或者一场比赛应该有几场比赛?

关于你的正则表达式突然出现的一件事是你使用.*,它有时会比你想要的更贪婪。也就是说,如果$item包含表达式

<rx:BuyItNowPrice xmlns:rx="urn:...nts">1395</rx:BuyItNowPrice>
<rx:CurrentPrice xmlns:rx="urn:...nts">1255</rx:CurrentPrice>
<rx:BuyItNowPrice xmlns:rx="urn:...nts">1395</rx:BuyItNowPrice>
<rx:SomeMoreStuff xmlns:rx="urn:...nts">zzz</rx:BuyItNowPrice>
<rx:CurrentPrice xmlns:rx="urn:...nts">1255</rx:CurrentPrice>

然后正则表达式的第一部分(\<rx\:CurrentPrice.*\>)将最终匹配第2,3和4行的所有内容,以及第5行的第一部分(直到>)。相反,您可能希望使用正则表达式 1

m/\<rx:CurrentPrice[^>]*>(\d+)\<\/rx:CurrentPrice\>/

只会在打开</rx:CurrentPrice>标记的单个实例后匹配结束<rx:CurrentPrice>标记。

1 另一个明显的答案是你根本不想使用正则表达式,与自定义解析模块相比,正则表达式是解析XML的劣质工具,并且所有您将不得不使用正则表达式处理的特殊情况最终会让您无意识地反复击败您的桌面。例如,见Salgar的答案。