如何在Perl中解析XML网页

3

你好,目前我能够解析保存在网页中的文件夹中的XML文件。

use strict;
use warnings;
use Data::Dumper;
use XML::Simple;

my $parser = new XML::Simple;
my $data = $parser->XMLin("config.xml");
print Dumper($data);

但是如果我试图从网站解析它,它就无法工作。
use strict;
use warnings;
use Data::Dumper;
use XML::Simple;

my $parser = new XML::Simple;
my $data = $parser->XMLin("http://website/computers/computers_main/config.xml");
print Dumper($data);

我遇到了以下错误:“文件不存在:http://website/computers/computers_main/config.xml,位于test.pl的第12行”

我该如何从网页解析多个xml文件?我需要从网站抓取多个xml并解析它。有人可以帮助我吗?

3个回答

3
请阅读XML::Simple的文档。请注意,XMLin方法可以使用文件句柄、字符串和甚至IO::Handle对象进行操作。但是它不能通过HTTP获取URL。
使用Perl模块LWP::Simple来获取所需的XML文件,并将其传递给XMLin
您需要使用cpan下载和安装LWP::Simple,就像之前为XML::Simple做的一样。

2
问题?那不是问题。XML::Simple也不是。 - ysth

2

超级编辑: 这种方法需要使用WWW::Mechanize,但它可以让您登录到您的网站,然后获取xml页面。您需要更改一些在注释中找到的内容。希望这能帮到您。

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

# Create a new instance of Mechanize
$bot = WWW::Mechanize->new();
# Create a cookie jar for the login credentials
$bot->cookie_jar(
        HTTP::Cookies->new(
            file           => "cookies.txt",
            autosave       => 1,
            ignore_discard => 1,
    )
);
# Connect to the login page
$response = $bot->get( 'http://www.thePageYouLoginTo.com' );
# Get the login form
$bot->form_number(1);
# Enter the login credentials.
# You're going to have to change the login and 
# pass(on the left) to match with the name of the form you're logging
# into(Found in the source of the website). Then you can put your 
# respective credentials on the right.
$bot->field( login => 'thisIsWhereYourLoginInfoGoes' );
$bot->field( pass => 'thisIsWhereYourPasswordInfoGoes' );
$response =$bot->click();
# Get the xml page
$response = $bot->get( 'http://website/computers/computers_main/config.xml' );
my $content = $response->decoded_content();
my $parser = new XML::Simple;
my $data = $parser->XMLin($content);
print Dumper($data);

试一下这个。如上所述,使用LWP::Simple。它只是连接到页面并获取该页面的内容(xml文件),然后通过XMLin运行。 编辑:在get $url行添加了简单的错误检查。 编辑2:将代码保留在此处,因为如果不需要登录,它应该可以工作。

use strict;
use warnings;
use Data::Dumper;
use XML::Simple;
use LWP::Simple;

my $parser = new XML::Simple;

my $url = 'http://website/computers/computers_main/config.xml';
my $content = get $url or die "Unable to get $url\n";
my $data = $parser->XMLin($content);

print Dumper($data);

嘿,谢谢你的回复。我尝试按照上面的方法操作,但出现了错误:“无法获取URL”。你有什么想法,可能是哪里出了问题呢?我已经正确安装了这两个模块。 - Maxyie
我认为问题可能仅仅是URL的错误,因为我正在使用与上述相同格式的URL,而且它似乎对我有效。你尝试过不同的URL吗?你可以谷歌搜索“filetype:xml someQuery”以获取一些测试XML文件。只需获取它们的URL并将其放入上面的脚本中,这样我们就可以看出是你的URL还是脚本的问题。 - iCanHasFay
你是正确的。这是一个身份验证问题。 我必须手动登录才能访问那个URL。有没有办法在Perl中绕过身份验证并解析所需的URL? - Maxyie
刚刚添加了一个新的代码块,您可以测试一下。您应该能够登录并获取您的XML文件。我不确定StackOverflow在我编辑答案时是否会通知您,这就是为什么我在这里发表评论的原因(我是新手)。 - iCanHasFay
嗨,感谢你的帮助。我会尝试一下,希望它能够正常工作。 - Maxyie
太好了。如果那个能正常工作,我有什么办法可以得到正确的答案吗?谢谢。 - iCanHasFay

1

如果您没有特定的理由坚持使用XML::Simple,则可以使用其他解析器,例如XML::Twig、XML::LibXML等,它们提供了一种内置功能来解析通过Web可用的XML。

以下是使用XML::Twig的简单代码示例:

use strict;
use warnings;
use XML::Twig;
use LWP::Simple;

my $url = 'http://website/computers/computers_main/config.xml';
my $twig= XML::Twig->new();
$twig->parse( LWP::Simple::get( $url ));

正如所说,XML::Simple没有这样的内置功能。


嘿,谢谢你的回复。但是我使用XML::Twig时出现了错误,提示“在test.pl第16行,/ur/lib/perl5/site_perl/5/10/i686-cygwin/XML/Parser.pm第197行处未找到元素,列0,字节-1”。你有什么想法,可能出了什么问题吗? - Maxyie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接