Извлечение таблицы HTML с помощью Perl

У меня есть следующая таблица:

<table cellpadding="4" cellspacing="0" border="0">
        <tr>
            <td>
                <span class="label">Label1< /pan> 
            </td>
            <td>
                label1_value1
            </td>
        </tr>
        <tr>
            <td>
                <span class="label">Label2</span> 
            </td>
            <td>
                            Label2_value1 <br/>
                            Label2_value2 <br/>

            </td>
        </tr>

        <tr valign="top">
            <td>
                <span class="label">Label3</span> 
            </td>
            <td>

                Result 1<br/>

                Result 2<br/>
                <span class="related"> - 
                                                     Result 1  SP2<br/> </span>
            </td>
        <\tr>
</table>

Я хочу использовать HTML::TableExtract для извлечения этой таблицы

Я использую следующий код для извлечения таблицы:

$te->parse($table_content);
foreach my $row ($te->rows) {
    if (defined($row->[1])) {
        $row->[1]=~s/^\s+//gm;
        $row->[1]=~s/\s+$/;/gm;
        print $row->[1],"\n";
    }
}

Я хочу результат в этом формате:

label1_value1,label1_value1;label1_value2,result1;result2-result3

но я получаю неправильные результаты, может кто-то помочь, что проблема с моим кодом или если есть возможность проанализировать пролеты с HTML::TableExtract

Я получаю следующее: label1_value1 Label2_value1 Label2_value2;

result1

result2

-

reuslt1;

1 ответ

Решение

Во-первых, в вашем HTML есть некоторые ошибки, такие как </pan> а также <\tr> и незамкнутый span тег. Как только они исправлены, код

#!/usr/bin/env perl

use warnings; use strict;
use HTML::TableExtract;

my $te = HTML::TableExtract->new(
    attribs => {
        cellpadding => '4', cellspacing => '0', border => '0'
    }
);

my ($table) = $te->parse(do { local $/; <DATA>} );
for my $row ( $table->rows ) {
    for my $cell (@$row) {
        $cell =~ s/^\s+//;
        $cell =~ s/\s+\z/;/;
        $cell =~ s/\s+/ /g;
    }
    print join("|", @$row), "\n";
}

дам тебе:

Label1; | label1_value1;
Label2; | Label2_value1 Label2_value2;
Label3; | Результат 1 Результат 2 - Результат 1 SP2;

Теперь я не знаю, какая логика приведет к тому, что вы получите желаемый результат:

label1_value1, label1_value1; label1_value2, результат1; результат2-result3

Не могли бы вы предоставить больше информации о том, что вы пытаетесь сделать?

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