Как я могу извлечь определенные столбцы с именами заголовков из файла HTML, используя Perl's HTML :: TableExtract

0

Я хотел бы извлечь информацию из следующего 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 &gt;= 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 &gt;= 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 &gt;= 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";
       }
    }

Я не могу получить желаемый результат. Пожалуйста, помогите улучшить мой код. благодаря

Теги:

1 ответ

0

Скорее всего, виновник

заголовки

Переданные как ссылка на массив, заголовки задают интересующие строки в верхней части столбцов в целевых таблицах. Они могут быть либо строками, либо регулярными выражениями (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 &gt;= 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)'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню