HTML::TableExtract - HTML 表格提取

回复
头像
523066680
Administrator
Administrator
帖子: 518
注册时间: 2016年07月19日 12:14
联系:

HTML::TableExtract - HTML 表格提取

帖子 523066680 »

以获取外汇牌价为例

代码: 全选

Getting Page: 1
货币名称    现汇买入价   现钞买入价   现汇卖出价   现钞卖出价   外管局中间价  中行折算价   发布时间    
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 20:13:46 
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 20:04:31 
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 20:04:31 
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 19:54:38 
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 19:37:28 
美元  657.61  652.21  660.25  660.25  658.08  658.08  2017.10.12 19:04:57 
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 19:02:32 
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 18:37:34 
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 18:32:19 
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 17:56:23 
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 17:31:39 
美元  657.51  652.11  660.15  660.15  658.08  658.08  2017.10.12 17:28:20 
美元  657.46  652.06  660.1   660.1   658.08  658.08  2017.10.12 17:24:10 
美元  657.46  652.06  660.1   660.1   658.08  658.08  2017.10.12 17:14:09 
美元  657.41  652.01  660.05  660.05  658.08  658.08  2017.10.12 17:10:01
=info
获取中行外汇牌价-美元栏目的信息
Auth: 523066680
Date: 2017-10
https://github.com/vicyang/Exchange-Rates
=cut

use Encode;
use Time::Local;
use File::Slurp;
use LWP::UserAgent;
use HTML::TableExtract;

use IO::Handle;
STDOUT->autoflush(1);

our $URL = "http://srh.bankofchina.com/search/whpj/search.jsp";
our $FH;
open $FH, ">:raw", "history.txt" or die "$!";

our $ua = LWP::UserAgent->new(
timeout => 5, keep_alive => 1, agent => 'Mozilla/5.0',
);

my $from = time_to_date(time() - 24*3600*1);
my $to = time_to_date(time()); # today

my $pageid = 1;
my $content;

while (1)
{
print "Getting Page: $pageid\n";
$content = get_page( $from, $to, $pageid );

#页码超出后会指向有效的最后一页而非404,实际页码不同步时结束循环
$content =~/var m_nCurrPage = (\d+)/;
last if ( $1 != $pageid );

get_info( $content );
$pageid++;
}

close $FH;
printf("Done\n");


sub get_info
{
my $html_str = shift;

# count => 1 表示选择第二个表格。
my $obj = HTML::TableExtract->new( depth => 0, count => 1 );
$obj->parse($html_str);

my $table;
grep { $table = $_ } $obj->tables;

for my $row ( $table->rows )
{
next if ( $row->[1] eq '' ); #表格最末一行为空
grep { print encode('gbk', decode('utf8', $_)), "\t" } @$row;
print "\n";
}
}

sub get_page
{
our $ua;
my ($from, $to, $pageid) = @_;
my $res;
$res = $ua->post(
$URL,
[
erectDate => $from,
nothing => $to,
pjname => "1316",
page => $pageid
]
);
return $res->content();
}

sub time_to_date
{
my ($sec, $min, $hour, $day, $mon, $year) = localtime( shift );
$mon += 1;
$year += 1900;
return sprintf "%d-%02d-%02d", $year,$mon,$day;
}
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客