Я хотел бы извлечь информацию из следующего html-блока, чтобы извлечь определенные столбцы с заголовком в Perl, используя HTML :: TableExtract.
<tr>
<th>Lane</th>
<th>Sample ID</th>
<th>Sample Ref</th>
<th>Index</th>
<th>Description</th>
<th>Control</th>
<th>Project</th>
<th>Yield (Mbases)</th>
<th>% PF</th>
<th># Reads</th>
<th>% of raw clusters per lane</th>
<th>% Perfect Index Reads</th>
<th>% One Mismatch Reads (Index)</th>
<th>% of >= Q30 Bases (PF)</th>
<th>Mean Quality Score (PF)</th>
</tr>
</table></div>
<div ID="ScrollableTableBodyDiv"><table width="100%">
<col width="4%">
<col width="5%">
<col width="19%">
<col width="8%">
<col width="7%">
<col width="5%">
<col width="12%">
<col width="7%">
<col width="4%">
<col width="5%">
<col width="4%">
<col width="5%">
<col width="6%">
<col width="5%">
<col>
<tr>
<td>1</td>
<td>test3_5_1</td>
<td></td>
<td>NoIndex</td>
<td></td>
<td></td>
<td>ABC</td>
<td>20,091</td>
<td>100.00</td>
<td>200,905,366</td>
<td>100.00</td>
<td>0.00</td>
<td>0.00</td>
<td>87.39</td>
<td>34.75</td>
</tr>
<tr>
<td>2</td>
<td>test5_1</td>
<td></td>
<td>NoIndex</td>
<td></td>
<td></td>
<td>ABC</td>
<td>10,280</td>
<td>100.00</td>
<td>102,799,692</td>
<td>100.00</td>
<td>0.00</td>
<td>0.00</td>
<td>89.60</td>
<td>35.57</td>
</tr>
так что я могу выводить как
Lane Sample ID Sample Ref Index Description Control Yield (Mbases) % of >= Q30 Bases (PF)
1 test3_5_1 NoIndex 20,091 87.39
2 test5_1 NoIndex 10,280 89.6
"Образец образца столбцов", "Описание", "Управление" будет пустым, но его нужно распечатать.
Я пробовал что-то вроде этого
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use HTML::TableExtract;
my @header=("Lane", "Sample ID", "Sample Ref", "Index", "Description", "Control", " Yield (Mbases)", " % of >= Q30 Bases (PF)");
my $te= new HTML::TableExtract (depth=>0, count=>1, headers=> \@header );
$te->parse_file('testhtml.txt');
my $table = $te->first_table_found;
foreach my $table ( $te->tables ) {
foreach my $row ($table->rows) {
no warnings "uninitialized";
print " ", join("\t", @$row), "\n";
}
}
Я не могу получить желаемый результат. Пожалуйста, помогите улучшить мой код. благодаря
Скорее всего, виновник
заголовки
Переданные как ссылка на массив, заголовки задают интересующие строки в верхней части столбцов в целевых таблицах. Они могут быть либо строками, либо регулярными выражениями (qr//). Если они являются строками, они в конечном итоге будут передаваться через не привязанное к регистру, не зависящее от регистра регулярное выражение, поэтому допускаются специальные символы регулярного выражения. (акцент мой)
Один из вариантов - использовать различные подстроки, соответствующие каждому столбцу, который вы хотите извлечь. Другим является передача каждой строки через quotemeta. Наконец, вы можете просто использовать шаблоны как в qr/\QYield (Mbases)/
или qr/\Q% of >= Q30 Bases (PF)/
. Я считаю, что использование различных подстрок будет более удобным. В конце концов, иногда люди меняют заголовки столбцов, но обычно существует определенная подстрока, которая должна присутствовать независимо от презентации.
Поскольку в вашем примере не было образца тела таблицы, я использовал параметр keep_headers
чтобы показать некоторый вывод. Это также полезно для предоставления вам фактических заголовков, которые были использованы.
#!/usr/bin/env perl
use strict;
use warnings;
use HTML::TableExtract;
my $te = HTML::TableExtract->new(
headers => [
'Lane',
'ID',
'Ref',
'Index',
'Description',
'Control',
'Yield',
'Q30 Bases',
],
keep_headers => 1,
);
$te->parse_file(\*DATA);
my @rows = $te->first_table_found->rows;
for my $row (@rows) {
print join("\n", map qq{'$_'}, @$row), "\n";
}
__DATA__
<div><table><tr>
<th>Lane</th>
<th>Sample ID</th>
<th>Sample Ref</th>
<th>Index</th>
<th>Description</th>
<th>Control</th>
<th>Project</th>
<th>Yield (Mbases)</th>
<th>% PF</th>
<th># Reads</th>
<th>% of raw clusters per lane</th>
<th>% Perfect Index Reads</th>
<th>% One Mismatch Reads (Index)</th>
<th>% of >= Q30 Bases (PF)</th>
<th>Mean Quality Score (PF)</th>
</tr>
</table></div>
Вывод:
$ ./jj.pl 'Lane' 'Sample ID' 'Sample Ref' 'Index' 'Description' 'Control' 'Yield (Mbases)' '% of >= Q30 Bases (PF)'