从表中获取数据?

时间:2016-06-04 17:07:58

标签: perl

如何从终端网站显示数据(股票名称,资本,收盘价,市场价值)?我有这个网站:

http://www.tpex.org.tw/web/stock/aftertrading/daily_mktval/mkt.php?l=en-us

,我创造了一些想法。

    my $url = 'http://www.tpex.org.tw/web/stock/aftertrading/daily_mktval/mkt.php?l=en-us';


  use LWP::Simple;
  my $content = get $url;
  die "Couldn't get $url" unless defined $content;

但我真的不知道如何使用$content来打印我需要的数据。

我会感激每一个帮助:)

2 个答案:

答案 0 :(得分:5)

你需要看一下优秀的HTML::TableExtract module

这是一个使用该模块提取所需数据的示例。我已经将URL用于适合打印的页面版本,原因有两个:标准页面在下载后使用JavaScript构建表格,因此LWP::Simple无法使用该表格。哪个没有JavaScript支持;它包含单个页面上的所有信息,而主页面将其分为许多短节

这是一种比使用正则表达式模式解析HTML更强大,更清晰,更灵活的技术,这通常是一个糟糕的想法

use strict;
use warnings 'all';

use LWP::Simple;
use HTML::TableExtract;

use open qw/ :std :encoding(utf-8) /;

use constant URL => 'http://www.tpex.org.tw/web/stock/aftertrading/daily_mktval/mkt_print.php?l=en-us';

my $content = get URL or die "Couldn't get " . URL;

my $te = HTML::TableExtract->new( headers => [
    qr/Stock\s+Name/,
    qr/Capitals/,
    qr/Close\s+Price/,
    qr/Market\s+Value/,
] );

$te->parse($content);

for my $row ( $te->rows ) {

    next unless $row->[0];        # Skip the final row with empty fields

    $_ = qq{"$_"} for $row->[0];  # Enclose the Stock Name in quotes
    tr/,//d for @{$row}[1,2,3];   # and remove commas from the numeric columns

    print join(',', @$row), "\n";
}

输出

"OBI Pharma, Inc.",171199584,594.00,101692
"Vanguard International Semiconductor Co.",1638982267,53.90,88341
"Hermes Microvision, Inc.",71000000,1155.00,82005
"TaiMed Biologics Inc.",247732750,238.00,58960
"Phison Electronics Corp.",197373993,271.00,53488
"FamilyMart.co.,Ltd",223220000,202.00,45090
"WIN SEMICONDUCTORS CORP.",596666262,65.30,38962
"PChome online Inc.",99854871,368.50,36796
"TUNG THIH ELECTRONIC CO.,LTD.",84488699,435.00,36752
"ST.SHINE OPTICAL CO.,LTD",50416516,694.00,34989
"POYA CO.,LTD",95277388,350.00,33347
"SIMPLO TECHNOLOGY CO.,LTD.",308284198,108.00,33294
"LandMark Optoelectronics Corporation",69909752,474.50,33172
"Ginko International Co., Ltd.",92697472,340.00,31517
"GIGASOLAR MATERIALS CORPORATION",60989036,506.00,30860
"TTY Biopharm Company Limited",248649959,114.00,28346
"CHIPBOND TECHNOLOGY CORPORATION",649261998,41.90,27204
"Globalwafers.Co.,Ltd.",369250000,69.10,25515
"eMemory Technology lnc.",75782242,321.00,24326
"Parade Technology, Ltd.",76111677,315.50,24013
"PharmaEngine, Inc.",102101000,235.00,23993
"JIH SUN FINANCIAL HOLDING CO., LTD",3396302860,6.86,23298
...

答案 1 :(得分:0)

简单的模式匹配和一些技巧足以实现它。

在您的任务$content中包含全文。

首先,使用带有$content标记的.+s中提取表格内容。 s标志有助于允许任何字符与新行匹配。

其次,使用</tr>分割提取的数据。

第三,迭代数组的foreach然后再次与分组进行模式匹配以提取数据。

此处$l1$l2存储rankstock code。其他数据将存储到@arc变量

my $url = 'http://www.tpex.org.tw/web/stock/aftertrading/daily_mktval/mkt_print.php?l=en-us&d=2016/06/04&s=0,asc,0';
use LWP::Simple;
my $content = get $url;
die "Couldn't get $url" unless defined $content;


my ($table_body) = $content =~m/<tbody>(.+)<\/tbody>/s;

my @ar = split("</tr>",$table_body);

foreach my $lines(@ar)
{
    my ($l1,$l2,@arc) = $lines =~m/>(.+?)<\/td>/g;
    $, = "\t\t";
    print @arc,"\n";
}