2010-06-02 2 views
0

Я потратил слишком много времени, пытаясь понять это. Я использую XML: RSS и Perl для чтения/анализа Ebay RSS-канала. В пределах области я вижу эти данные:Чтение пользовательских значений в Ebay RSS-канале (XML :: 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-канал.

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

} 

ответ

1

Если у вас есть RSS/XML документ и хотите конкретные данные, которые вы могли бы использовать XPATH:

Perl CPAN XPATH

XPath Introduction

+0

Спасибо - я рассматриваю это как возможное решение. – user356619

0

Каким образом «он не работает» из 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 (до >). Вместо этого, вы можете захотеть, чтобы использовать регулярное выражение

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

которые будут соответствовать только до закрытия </rx:CurrentPrice> тега после одного экземпляра открытия <rx:CurrentPrice> тега.

Другой очевидный ответ, что вы действительно не хотите использовать регулярное выражение, вообще, что регулярные выражения являются низшими инструменты для разбора XML по сравнению с собственных модулей синтаксического анализа, и что все особые случаи вы будете должны иметь дело с использованием регулярных выражений, в конечном итоге сделают вас бессознательными из-за того, что вы неоднократно били головой против своего стола. См. Например, ответ Сальгара.

+0

Спасибо. Я знаю, что '. *' Жадный. Я просто ленился, пытаясь заставить меня дать мне какой-то результат, чтобы я мог при необходимости настроить. Кроме того, я изучаю вещи, когда я иду - у меня нет кодового фона ... я еще ничего не знаю.«Это не работает», я имел в виду, что никакого вывода не было, когда я добавил это регулярное выражение внутри цикла foreach. Я собираюсь придерживаться данных из HTML на данный момент (самый простой, быстрый ответ на данный момент), и если я это выясню, я опубликую здесь «fix» - я вижу, где другие тоже была эта проблема. Еще раз спасибо. – user356619

Смежные вопросы