如何使用Perl获取与标头相对应的HTML表格单元格值

时间:2013-05-24 12:54:03

标签: perl scripting perl-data-structures

我在服务器中有多个HTML页面,每个页面都有不同的格式。但是,每个页面都包含一个包含一些标题和行值的表。

现在我想读取标题并将其单元格值与之关联。我是Perl的新手并且很难完成它。

以下是HTML示例:

<Table Border=1 width="100%">
  <tr>
    <td colspan=12 align="Center" nowrap ><B>Detailed Information for Check # 6392933</B></td>
  </tr>
  <tr>
    <td><b>PO Number</b></td>
    <td><b>Invoice Number</b></td>
    <td><b>DC Number</b></td>
    <td><b>Store Number</b></td>
    <td><b>Division</b></td>
    <td><b>Invoice Amount</b></td>
  </tr>
  <tr>
    <td>0000000000</td>
    <td>000000118608965</td>
    <td>0</td>
    <td>1860</td>
    <td>1</td>
    <td>$-21.02</td>
  </tr>
  <tr>
    <td>0000000000</td>
    <td>000000122865088</td>
    <td>0</td>
    <td>2286</td>
    <td>1</td>
    <td>$-42.04</td>
  </tr>
</Table>

现在我想创建一个Perl结构,其中所有单元格值都应存储到其标题值中,并应打印如下内容:

PO Number = 0000000000, 0000000000
Invoice Number=000000118608965, 000000122865088
DC number= 0, 0 and so on.

我尝试过从互联网上搜索和做任何事情,但没有任何作用,我只是将单元格值转换为变量,但这没有用,因为它将所有值都转换为单元格值。

#!/usr/bin/Perl -w

$file = "/Path/to/file";
use Encode;
$da = `cat "$file"`;
my $data = decode_utf8($da);

use HTML::Parser;
use HTML::TableContentParser;

$tcp    = HTML::TableContentParser->new;
$tables = $tcp->parse($data);

for $t (@$tables) {
    for $r (@{ $t->{rows} }) {
        print "Row: ";
        for $c (@{ $r->{cells} }) {
            $col = $c->{data};
            print $col;
        }
        print "\n";
    }
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

创建

HTML::TableExtract以从HTML表中提取信息。使用方法如下:

#!/usr/bin/perl
use warnings;
use strict;

use HTML::TableExtract;

my $file = 'input.html';

my $te = 'HTML::TableExtract'->new;
$te->parse_file($file);
my $t = $te->first_table_found;

my @columns;
my $first = 1;
for my $row ($t->rows) {
    $first = 0, next if $first;
    push @{ $columns[$_] }, $row->[$_] for 0 .. $#$row;
}

for my $column (@columns) {
    print "$column->[0] = ", join(', ', @{ $column }[1 .. $#$column]), "\n";
}

输出:

PO Number = 0000000000, 0000000000
Invoice Number = 000000118608965, 000000122865088
DC Number = 0, 0
Store Number = 1860, 2286
Division = 1, 1
Invoice Amount = $-21.02, $-42.04

答案 1 :(得分:0)

在这种情况下我个人使用Split。 拆分数组(将是分隔符),然后拆分另一个。