Perl WWW::Mechanize::Firefox 已成功检索网页的内容,并存储在标量变量$content
中。
my $url = 'http://finance.yahoo.com/quote/AAPL/financials?p=AAPL';
$mech->get($url);
my $content= $mech->content();
在检查$content
时,我感兴趣的是识别和保存table
内span tags
之间的所有信息。
有各种各样的课程,我不感兴趣。
尝试#1不起作用。
my $tree = HTML::TreeBuilder->new_from_content($txtRawData);
my @list = $mech->find('span');
foreach ( @list ) {
print $_->as_HTML();
}
尝试#2不起作用。
foreach my $tag ($tree->look_down(_tag => 'span')) {
my $value = $tag->as_text;
}
感兴趣的 HTML 表是:
<div class="Mt(10px)">
<table class="Lh(1.7) W(100%) M(0)">
<tbody>
<tr class="Bdbw(1px) Bdbc($lightGray) Bdbs(s) H(36px)">
<td class="Fw(b) Fz(15px)">
<span>Revenue</span>
</td>
<td class="C($gray) Ta(end)">
<span>9/24/2016</span>
</td>
<td class="C($gray) Ta(end)">
<span>9/26/2015</span>
</td>
<td class="C($gray) Ta(end)">
<span>9/27/2014</span>
</td>
</tr>
<tr class="Bdbw(1px) Bdbc($lightGray) Bdbs(s) H(36px)">
<td class="Fz(s) H(35px) Va(m)">
<span>Total Revenue</span>
</td>
<td class="Fz(s) Ta(end)">
<span>
<span>215,639,000</span>
</span>
</td>
<td class="Fz(s) Ta(end)">
<span>
<span>233,715,000</span>
</span>
</td>
<td class="Fz(s) Ta(end)">
<span>
<span>182,795,000</span>
</span>
</td>
</tr>
<tr class="Bdbw(1px) Bdbc($lightGray) Bdbs(s) H(36px)">
<td class="Fz(s) H(35px) Va(m)">
<span>Cost of Revenue</span>
</td>
<td class="Fz(s) Ta(end)">
<span>
<span>131,376,000</span>
</span>
</td>
<td class="Fz(s) Ta(end)">
<span>
<span>140,089,000</span>
</span>
</td>
<td class="Fz(s) Ta(end)">
<span>
<span>112,258,000</span>
</span>
</td>
</tr>
<tr class="Bdbw(0px)! H(36px)">
<td class="Fw(b) Fz(s) Pb(20px)">
<span>Gross Profit</span>
</td>
<td class="Fw(b) Fz(s) Ta(end) Pb(20px)">
<span>
<span>84,263,000</span>
</span>
</td>
<td class="Fw(b) Fz(s) Ta(end) Pb(20px)">
<span>
<span>93,626,000</span>
</span>
</td>
<td class="Fw(b) Fz(s) Ta(end) Pb(20px)">
<span>
<span>70,537,000</span>
</span>
</td>
</tr>
</tbody>
</table>
</div>
选择(设置焦点)一个特定table
(它们可以是$content
变量内的多个表)并将span tags
之间的文本保存到数组(要传递给下一个过程 - 插入到数据库表中)的最佳方法是什么?
我还想强调:
- 有时,文本位于两(双)组
span tags
内。 - 没有表标题行(或
th
标记)。
如果您实际上在$tree
而不是$mech
上进行了第一次尝试,那么您的第一次尝试就有效。 结合您第二次尝试的as_text
非常好。
use HTML::TreeBuilder;
my $tree = HTML::TreeBuilder->new_from_content(my @foo = <DATA>);
my @list = $tree->find('span');
foreach ( @list ) {
say $_->as_text();
}
__DATA__
<div class="Mt(10px)">
<table class="Lh(1.7) W(100%) M(0)">
...
这将输出跨度内容的列表。您应该能够清理它们并使用它们。
Revenue
9/24/2016
9/26/2015
9/27/2014
...
当然,作为一个实际的表(数组的数组),它可能更有意义,但为此我们必须知道你要做什么。