Perl Mechanize识别特定div标签

时间:2017-03-13 18:51:55

标签: perl www-mechanize-firefox html-tableextract html-treebuilder

Perl WWW :: Mechanize :: Firefox已成功检索网页内容,并存储在标量变量$content中。

my $url = 'http://finance.yahoo.com/quote/AAPL/financials?p=AAPL';
$mech->get($url);
my $content= $mech->content();

在审核$content时,我有兴趣在span tags内的table之间识别并保存所有信息。

有一些我不感兴趣的课程。

尝试#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之间一个数组(要传递给下一个程序 - 插入数据库表)?

我还要强调一点:

  1. 有时,文本位于span tags的两(双)组内。
  2. 没有表标题行(或th标记)。

1 个答案:

答案 0 :(得分:1)

如果您实际在$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
...

当然作为一个实际的表(数组数组),它可能更有意义,但为此我们必须知道你正在尝试做什么。