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
в массив (для передачи в следующую процедуру - для вставки в таблицу базы данных)?
Я также хотел бы подчеркнуть, что:
- Иногда текст находится внутри двух (двойных) наборов
span tags
, - Нет строки заголовка таблицы (или
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
...
Конечно, в качестве реальной таблицы (массива массивов) это, вероятно, имело бы больше смысла, но для этого нам нужно было бы знать, что вы пытаетесь сделать.