尝试在Perl中使用HTML::TableExtract从HTML文件中提取表,但失败

尝试在Perl中使用HTML::TableExtract从HTML文件中提取表,但失败,perl,html-tableextract,Perl,Html Tableextract,我试图从以下站点的表格中提取每个G蛋白偶联受体的信息: 更具体地说,我想从列中提取信息(配体、Sp、动作、亲和力、单位)。目前,我一直在从提取中输出空文件,因此模块似乎无法识别我指定的表。这是我到目前为止编写的代码,它被设计用来遍历每个HTML文件,该文件对应于每个G蛋白偶联受体的信息 use warnings; use strict; use HTML::TableExtract; my @names = `ls /home/wallakin/LINDA/ligands/iuphar/da

我试图从以下站点的表格中提取每个G蛋白偶联受体的信息:

更具体地说,我想从列中提取信息(配体、Sp、动作、亲和力、单位)。目前,我一直在从提取中输出空文件,因此模块似乎无法识别我指定的表。这是我到目前为止编写的代码,它被设计用来遍历每个HTML文件,该文件对应于每个G蛋白偶联受体的信息

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

my @names = `ls /home/wallakin/LINDA/ligands/iuphar/data/html`;

foreach (@names)
{
#Delete empty lines in HTML
open (IN, "</home/wallakin/LINDA/ligands/iuphar/data/html/$_") or die "Can't open html";
my @htmllines = <IN>;
close IN;
for (@htmllines)
{
    s/^\s*$// or s/^\s*//;
}
open (OUT, ">/home/wallakin/LINDA/ligands/iuphar/data/html2/$_");
print OUT @htmllines;
close OUT;

#Extract data from HTML tables based on column headers
my $te = HTML::TableExtract->new ( 
                    headers => [ qw(Ligand Sp. Action Affinity Units) ],
                    depth => 1,
                    count => 1


                    );


$te->parse_file("/home/wallakin/LINDA/ligands/iuphar/data/html2/$_");

my $output = $_;
$output =~ s/\.html/\.txt/g;
open (RESET, ">/home/wallakin/LINDA/ligands/iuphar/data/ligands/$output");
close RESET;
open (DATA, ">>/home/wallakin/LINDA/ligands/iuphar/data/ligands/$output");
binmode (DATA, ":utf8");
binmode (STDOUT, ":utf8");  


foreach my $ts ($te->tables)
{
    print "Table (", join(',', $ts->coords), "):\n";


    foreach my $row ($te->rows)
    {

        foreach ( grep {defined} @$row)
        {
            $_ =~ s/\n/\ /g;
            $_ =~ s/\r//g;  
            #$_ =~ s/\s+/ /g;
        }

        #Each column's data separated by tabs
        print DATA join ("\t", grep {defined} @$row),"\n";
    }
}
close DATA;
}
使用警告;
严格使用;
使用HTML::TableExtract;
my@names=`ls/home/wallakin/LINDA/ligands/iuphar/data/html`;
foreach(@names)
{
#删除HTML中的空行

打开(在“中),这似乎适用于您提供的URL:

use 5.014;
use strict;
use warnings;
use open qw(:std :utf8);

use HTML::TableExtract;

my $te = HTML::TableExtract->new(
    headers => [qw(Ligand Sp. Action Affinity Units Reference)],
);

$te->parse_file('sample.html');

my @tables = $te->tables;
for my $t (@tables) {
    my @rows = $t->rows;
    for my $r (@rows) {
        for my $c (@$r) {
            $c =~ s/\A\s+//;
            $c =~ s/\s+\z//;
        }
        say "@$r";
    }
}

这似乎适用于您提供的URL:

use 5.014;
use strict;
use warnings;
use open qw(:std :utf8);

use HTML::TableExtract;

my $te = HTML::TableExtract->new(
    headers => [qw(Ligand Sp. Action Affinity Units Reference)],
);

$te->parse_file('sample.html');

my @tables = $te->tables;
for my $t (@tables) {
    my @rows = $t->rows;
    for my $r (@rows) {
        for my $c (@$r) {
            $c =~ s/\A\s+//;
            $c =~ s/\s+\z//;
        }
        say "@$r";
    }
}

/home/wallakin/LINDA/ligands/iuphar/data/html2/中的HTML文件是否只是您提供的URL中的原始HTML?您的代码是直接的,并且应该很容易调试,假设其他人(如我)也是这样可以复制输入数据。假设HTML::TableExtract工作,这也不是我所确定的。感谢您的回复!是的,它是用正则表达式替换来删除空行的原始HTML文件。是/home/wallakin/LINDA/ligands/iuphar/data/html2/中的HTML文件之一,只是您提供的URL中的原始HTML吗ided?您的代码很简单,并且应该很容易调试,假设其他人(比如我)可以复制输入数据。假设HTML::TableExtract工作,这也不是我所确定的。感谢您的回复!是的,这是使用正则表达式替换编辑的原始HTML文件,用于删除空行。我尝试了此操作,但出现了此错误:“字符串在extract_iuphar_dbdata.pl第50行附近的预期位置找到运算符。”“say”@$r”“(您需要预先声明吗?)“他正在使用Perl 5.14。如果您因为使用较旧的Perl版本而删除了“use Perl”行,只需将“say”替换为“print”。除此之外,当我尝试在@$row上使用print命令时,我会遇到以下错误:“全局符号“$row”要求在extract_iuphar_dbdata.pl第49行使用显式包名。”问题解决了。结果是我忘了啃我的文件名列表,这导致我的解析器无法识别我输入的文件名。否则,您的代码工作得很好!非常感谢,大家!我尝试了这一点,但出现了以下错误:“字符串在extract_iuphar_dbdata.pl第50行的“say”@$r附近找到了运算符期望的位置”(你需要预先声明吗?)他使用的是Perl 5.14。如果因为Perl版本较旧而放弃了“use Perl”这一行,只需将“say”替换为“print”。除此之外,当我尝试在@$row上使用print命令时,会出现以下错误:“全局符号“$row”需要在extract_iuphar_dbdata.pl第49行显示包名。”问题解决了。结果是我忘了咀嚼我的文件名列表,这导致我的解析器无法识别我输入的文件名。否则,你的代码工作得很好!谢谢大家!