【发布时间】:2014-05-28 21:14:25
【问题描述】:
我想从几个 html 页面中提取数据,但不熟悉 HTML 提取。我有一个工作代码可以读取整个页面源代码,然后使用正则表达式删除不需要的部分,但它似乎很慢。
我正在阅读财务信息,只想从每一页中提取一个数字,所以实际上我不想每次都阅读整个页面。
这就是我在 Perl 中所拥有的:
use LWP::Simple;
my $mult;
my $url = 'http://www.wikinvest.com/stock/Apple_(AAPL)/Data/Net_Income/2014/Q1';
$content = get($url);
$content =~ s/\R//g; # remove linebreaks
$content =~ s/.*\<div class="nv_lefty" id="nv_value">//; # remove everything before tag
$content =~ s/\<.*//g; # remove everything after <...
if ($content =~ s/billion//) {$mult = 1e9;}
elsif ($content =~ s/million//) {$mult = 1e6;}
else {$mult = 1;}
$content =~ s/[^\d.-]//g; # keep numbers, commas and - only
$content = $content * $mult;
get($url) 命令非常慢,因为它会提取大量数据,而我只对单个数字感兴趣。有没有更快的方法来做到这一点?我查看了 HTML::TableExtract,但我认为我提取的数字不在标准 HTML 表格中。也不确定它是否会更快。
【问题讨论】:
-
如果 get($url) 部分很慢,那么这不是您的代码,而是您所依赖的外部网站速度(HTTP 请求/响应)。
-
如果您需要执行许多这样的请求(即获取 1000 多个页面),那么加速它的唯一方法可能是运行脚本或线程的多个实例以让更多并行进程执行请求同时。
-
其他金融网站是否有您正在寻找的更好格式的数据?我认为您可能能够从 Yahoo 的一个 csv 文件中获取您正在寻找的所有信息。您要检索的具体号码是多少?
-
替换完全没有用,因为您要查找的数据总是在同一个地方:
<div class="nv_lefty" id="nv_value">$10.22 billion</div>。你只需要使用一个 DOM 查询、一个 XPath 查询或一个匹配这个特定 id 的正则表达式。