如何在 perl 中获取 xml 响应中发送的文件?

how to get the file sent in xml response in perl?

我使用 LWP 用户代理发送请求并获得响应。 我将收到 html 格式的回复,并在其中附加一个文件。

例如:

     `<html>
      <head>
      <title>Download Files</title>
      <meta http-equiv=\'Content-Type\' content=\'text/html; charset=utf-8\'>
      <link rel=\'stylesheet\' href=\'http://res.mytoday.com/css/main.css\' type=\'text/css\'>
      <link rel=\'stylesheet\' href=\'http://res.mytoday.com/css/Menu.css\' type=\'text/css\'>
      <link rel=\'stylesheet\' href=\'/statsdoc/freeze.css\' type=\'text/css\'>
      </head>
      <body>
      <table border=1>
      <tr class=\'rightTableData\'>
      <th>No.</th>
      <th>File Name</th> 
      <th>File Size</th>
      </tr><tr class=\'rightTableData\'>
      <td>1</td><td>
      <a href=\'/dlr_download?file=/mnt/dell6/SRM_DATA/data/API_FILE     /20160329/LSUZisbZahtHNeImZJm_1-1.csv.zip\'>1-1.csv.zip</a>
     </td><td>487 bytes</td>  </tr>
     </table>
     </br></br>  
     <center><a href=\'/dlr_download?file=/mnt/dell6/SRM_DATA/data/API_FILE/20160329/LSUZisbZahtHNeImZJm-csv.zip\'>Download all</a></center>                                                         
    </body></html>`

我需要从这个响应中获取文件。谁能帮我从响应中获取文件。

使用解析器提取信息。我使用了 XML::LibXML,但我不得不删除导致解析器失败的结束 br 标记。

#!/usr/bin/perl
use warnings;
use strict;

my $html = '<html>
      <head>
      <title>Download Files</title>
      <meta http-equiv=\'Content-Type\' content=\'text/html; charset=utf-8\'>
      <link rel=\'stylesheet\' href=\'http://res.mytoday.com/css/main.css\' type=\'text/css\'>
      <link rel=\'stylesheet\' href=\'http://res.mytoday.com/css/Menu.css\' type=\'text/css\'>
      <link rel=\'stylesheet\' href=\'/statsdoc/freeze.css\' type=\'text/css\'>
      </head>
      <body>
      <table border=1>
      <tr class=\'rightTableData\'>
      <th>No.</th>
      <th>File Name</th> 
      <th>File Size</th>
      </tr><tr class=\'rightTableData\'>
      <td>1</td><td>
      <a href=\'/dlr_download?file=/mnt/dell6/SRM_DATA/data/API_FILE     /20160329/LSUZisbZahtHNeImZJm_1-1.csv.zip\'>1-1.csv.zip</a>
     </td><td>487 bytes</td>  </tr>
     </table>
     <!-- </br></br> I had to comment this out! -->
     <center><a href=\'/dlr_download?file=/mnt/dell6/SRM_DATA/data/API_FILE/20160329/LSUZisbZahtHNeImZJm-csv.zip\'>Download all</a></center>                                                         
    </body></html>';

use XML::LibXML;
my $dom = 'XML::LibXML'->load_html( string => $html );
print $dom->findvalue('/html/body/table/tr[2]/td[2]/a/@href');

您还可以使用 recover 标志来解析无效的 HTML:

my $dom = 'XML::LibXML'->load_html( string => $html, recover => 1 );