-2

WWW::Mechanize を使用して Twitter API をクエリし、(XML) 結果を@content

次に、そのコンテンツからユーザー ID を検索します (必要なデータは常に<id>...</id>タグの間に保存されます)。次の正規表現は、ダウンロードしたファイルで完全に機能します。

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

しかし、@contentMechanize で作成した配列では機能しません。一致するものが 1 つしかない場合です。

StackOverflow の他の場所で見つけた look between メソッドを使用してみましたが、それはニシンだったようです:

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

私は何かが欠けていますが、(StackOverflowまたは他の場所で常に答えを何年も見つけた後)私は困惑しています. 明らかに、正しい質問の仕方さえ知りません。私は何が欠けていますか?Mechanize が配列を格納する方法と関係がありますか?

4

3 に答える 3

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');
于 2012-05-25T21:31:17.047 に答える
0

XML の場合、XML パーサーを使用する必要があります。XML が次のようになる場合はどうでしょうか。

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

@content をダンプして、すべてが正しいことを確認する必要があります。

于 2012-05-25T19:30:57.127 に答える
-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";
    }
}
于 2012-05-25T20:11:34.220 に答える