Чтение пользовательских значений в ленте RSS Ebay (модуль XML :: RSS) - PullRequest
1 голос
/ 02 июня 2010

Я потратил слишком много времени, пытаясь понять это. Я использую XML: RSS и Perl для чтения / анализа RSS-канала Ebay. В пределах области я вижу эти записи:

<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-канал.

Я могу получить большую часть необходимой информации из области элемента-> описания (# ставки, время окончания аукциона, цена 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 ]

1 голос
/ 02 июня 2010

Если у вас есть документ rss / xml и вам нужны конкретные данные, вы можете использовать XPATH:

Perl CPAN XPATH

XPath Введение

0 голосов
/ 02 июня 2010

Как «не работает» из RSS-канала? Вы имеете в виду отсутствие совпадений, когда должны быть совпадения? Или один матч, где должно быть несколько матчей?

Одна вещь, которая бросается в глаза из-за вашего регулярного выражения, это то, что вы используете .*, что иногда может быть жаднее, чем вы хотите. То есть, если $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 по сравнению с настроенными модулями синтаксического анализа, и что все специальные случаи, с которыми вам придется иметь дело с использованием регулярных выражений, в конечном итоге приведут вас в бессознательное состояние от неоднократного избиения головой о стол. См. Ответ Салгара, например.

...