Perl Mechanize идентифицирует содержимое между тегом span внутри определенного тега div

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 ответ

Ваша первая попытка работает, если вы действительно делаете это на $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
...

Конечно, в качестве реальной таблицы (массива массивов) это, вероятно, имело бы больше смысла, но для этого нам нужно было бы знать, что вы пытаетесь сделать.

Другие вопросы по тегам