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

时间:2016-03-30 13:29:55

标签: perl lwp-useragent

使用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>`

从这个回复我需要得到文件。任何人都可以帮我从响应中获取文件。

1 个答案:

答案 0 :(得分:1)

使用解析器提取信息。我使用了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 );