Perl和Mechanize:我的简单正则表达式无法获得多个匹配项

时间:2012-05-25 19:13:54

标签: regex perl mechanize

我使用WWW :: Mechanize查询Twitter API并将(XML)结果存储到@content

现在我想在该内容中搜索用户ID(我想要的数据总是存储在<id>...</id>标签之间)。以下正则表达式适用于下载的文件:

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

但它不会对我使用Mechanize创建的@content数组起作用,只会给我一个匹配。

我尝试使用我发现elsewhere on StackOverflow的方法之间的外观,但这似乎是一个红色的鲱鱼:

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

我错过了一些东西,但是(多年来总是在StackOverflow或其他地方找到答案)我很难过。很明显,我甚至不知道如何提出正确的问题。我错过了什么?它与Mechanize存储数组的方式有关吗?

3 个答案:

答案 0 :(得分: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');

答案 1 :(得分:0)

对于XML,您需要使用XML解析器。什么,如果您的XML将是这样的?

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

你需要转储你的@content以确保一切正确。

答案 2 :(得分:-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";
    }
}