【问题标题】:how do i parse xml webpage in perl我如何在 perl 中解析 xml 网页
【发布时间】:2012-05-16 12:45:58
【问题描述】:

你好目前我可以解析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 at test.pl 第 12 行”

如何解析网页中的多个 xml 文件?我必须从网站中获取多个 xml 并对其进行解析。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: xml perl xml-parsing


    【解决方案1】:

    阅读XML::Simple 的文档。请注意,XMLin 方法可以采用文件句柄、字符串,甚至是 IO::Handle 对象。它不能接受通过 HTTP 的 URL。

    使用 Perl 模块 LWP::Simple 获取您需要的 XML 文件并将其传递给 XMLin

    您必须使用cpan 下载并安装LWP::Simple,就像之前为XML::Simple 所做的那样。

    【讨论】:

    • 有问题吗?这不是问题。 XML::Simple 也不是。
    【解决方案2】:

    超级编辑: 此方法需要 WWW::Mechanize,但它允许您登录到您的网站然后获取 xml 页面。您将不得不更改 cmets 中的一些内容。希望这可以帮助。

    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 行添加了简单的错误检查。 Edit2: 将代码保留在这里,因为如果不需要登录,它应该可以工作。

    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”。任何想法可能会出现什么问题。我已经正确安装了两个模块。
    • 我认为这可能只是 URL 的错误,因为我使用的是与上述格式相同的 url,而且它似乎对我有用。你试过不同的网址吗?您可以谷歌“filetype:xml someQuery”来获取一些测试 xml 文件。只需抓取他们的 URL 并将它们放在上面的脚本中,这样我们就可以查看它是您的 URL 还是脚本。
    • 你是对的。这是身份验证问题。我必须手动登录才能访问该网址。有没有办法在 perl 中通过身份验证并解析所需的 url?
    • 刚刚添加了一个可以测试的新代码块。您应该能够登录然后获取您的 xml 文件。我不确定当我编辑我的答案时 StackOverflow 是否会通知你,这也是我在这里发表评论的原因(这里是新人)。
    • 您好,感谢您的帮助。我会试试的。希望它会起作用。
    【解决方案3】:

    如果您没有任何特定的理由坚持使用 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 我收到错误消息“在 /ur/lib/perl5/site_perl/5 的第 1 行第 0 列字节 -1 上找不到元素/10/i686-cygwin/XML/Parser.pm 第 197 行 at test.pl 第 16 行“知道会出什么问题吗?
    猜你喜欢
    • 2012-07-07
    • 2013-03-28
    • 2011-08-08
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多