2012-05-25 33 views
-2

我使用WWW ::機械化查詢Twitter的API和存儲(XML)的結果爲@contentPerl和機械化:無法獲取多個匹配我的簡單的regex

現在我想通過搜索用戶ID的內容(我想要的數據是總是存儲在<id>...</id>標籤之間)。下面的正則表達式完美的作品上下載的文件:

for (@content) { 
    if (m/<id>(\d+)<\/id>/) { 
    print "$1\n"; 
    } 
} 

,但它不會在@content陣列,我和機械化,創建工作時,它只會給我一個匹配。

我使用方法之間的樣子,我發現elsewhere on StackOverflow嘗試,但似乎一直是紅鯡魚:

m/(?<=<id>)(\d{1,})(?=<\/id>)/g 

我失去了一些東西,但(經過多年的總是找對答案StackOverflow或其他地方)我很難過。顯然,我甚至不知道如何提出正確的問題。我錯過了什麼?這與Mechanize存儲陣列的方式有關嗎?

+2

[他來的小馬...](http://stackoverflow.com/a/1732454/554546) – 2012-05-25 19:22:40

+1

除了什麼@JackManey說,有一個看看https://metacpan.org/module/Net::Twitter。它會爲你完成繁重的工作。 – oalders

+0

雖然我被@ JackManey的迴應逗樂了(我真的爲我的問題對SO的道德崩潰做出了貢獻?),但我不認爲它完全解決了我的觀點。我可以用各種方式解決問題 - 但這些都不會讓我明白爲什麼兩個(對我)完全相同的數組(如果我'打印Dumper(@content);'它們看起來是相同的)不要使用相同的正則表達式。 什麼 - 重複我悽慘的問題 - 我錯過了?爲什麼機械化內容的行爲與下載的內容有所不同? – mediaczar

回答

-1

試試這個:

use strict; 
use warnings; 
use WWW::Mechanize; 
use Data::Dumper; 

my $mech = WWW::Mechanize->new(); 

my $url = "http://api.twitter.com/1/followers/ids/twitter.xml"; 

$mech->get($url); 

# $mech->content is string 

#print Dumper ($mech->content); 

my @data = split /\n/ , $mech->content; 

foreach (@data) 
{ 
# $VAR4987 = '<id>340750222</id>'; 
    if (/<id>(\d+)<\/id>/) 
    { 
     print $1; print "\n"; 
    } 
} 
+0

'split/\ n /,$ mech-> content;'正是我所需要的。我是一個瘸子;我正在有效地創建單個項目數組(整個文件作爲項目)。非常感謝! – mediaczar

0

對於XML,您需要使用XML解析器。什麼,如果你的XML會是這樣的?

<id param="test"> 
4 
</id> 

而且您需要轉儲您的@content以查看一切正確。

+0

有時正則表達式可以在X/HTML語言中快速簡潔地處理X/HTML的任務,這些語言中您必須努力尋找一個好的解析器......但在Perl中,解析器顯然比正則表達式本身更易於使用。 – djechlin

+0

我已經編輯了這個問題,以明確XML將始終如一。我知道我可以使用XML :: Simple但仍然感謝你。但我的問題仍然存在:爲什麼Mechanize數組的行爲不像我通過從本地下載中讀取相同文件創建的數組? – mediaczar

+0

@djechlin謝謝。這可能是真的。這開始作爲一個sl shell的外殼行:'curl http://api.twitter.com/1/followers/ids/twitter.xml | sed's/<[^>] *> // g'| sed'/^$/d'',我不願意更加努力地工作。但它(對我而言)引發了一個有趣的問題,我並不真正理解。 – mediaczar

3
use 5.010; 
use strictures; 
use WWW::Mechanize qw(); 
use XML::LibXML qw(); 

my $mech = WWW::Mechanize->new; 
$mech->get('http://api.twitter.com/1/followers/ids/twitter.xml'); 
my $dom = XML::LibXML->load_xml(string => $mech->content); 

# or skip the middle-man: 
# my $dom = XML::LibXML->load_xml(location => 'http://api.twitter.com/1/followers/ids/twitter.xml'); 

say $_->textContent for $dom->findnodes('//id'); 
+0

這真的很有用:非常感謝。我一直在使用XML :: Simple--看起來我可以在更短的時間內做更多的事情...... – mediaczar