使用PERL从HTML表中获取值

使用PERL从HTML表中获取值,html,perl,Html,Perl,我试图从已经存在的html表中使用精确的td(单元格)获取值。有人能帮我吗 现有表的代码如下所示。 <table> <tr><td class="key">FIRST NAME</td><td id="firstname" class="value">ALEXANDR</td></tr> <tr><td class="key">SURNAME NAME</td><td i

我试图从已经存在的html表中使用精确的td(单元格)获取值。有人能帮我吗

现有表的代码如下所示。

<table>
<tr><td class="key">FIRST NAME</td><td id="firstname" class="value">ALEXANDR</td></tr>
<tr><td class="key">SURNAME NAME</td><td id="surname" class="value">PUSHKIN</td></tr>
<tr><td class="key">EMAIL</td><td id="email" class="value">apushkin@mail.ru</td></tr>
<tr><td class="key">TELEPHONE</td><td id="telephone" class="value">+991122334455</td></tr>
</table> 
$pp = get("http://www.domain.com/something_something");
$out[0]="/home/.../public_html/perl_output.txt";
($firstname) = ($str =~ /<td id="firstname" class="value">(.+?)<\/firstname/);
($surname) = ($str =~ /<td id="surname" class="value">(.+?)<\/surname/);
($email) = ($str =~ /<td id="email" class="value">(.+?)<\/email/);
($telephone) = ($str =~ /<td id="telephone" class="value">(.+?)<\/telephone/);

print "First Name: $firstname \n";
print "Last Name: $surname \n";
print "Email: $email \n";
print "Telephone: $telephone \n";

exit;

名字Alexandr
姓名普希金
EMAILapushkin@mail.ru
电话+991122334455
我在perl脚本下面尝试了这个,但它不起作用。

<table>
<tr><td class="key">FIRST NAME</td><td id="firstname" class="value">ALEXANDR</td></tr>
<tr><td class="key">SURNAME NAME</td><td id="surname" class="value">PUSHKIN</td></tr>
<tr><td class="key">EMAIL</td><td id="email" class="value">apushkin@mail.ru</td></tr>
<tr><td class="key">TELEPHONE</td><td id="telephone" class="value">+991122334455</td></tr>
</table> 
$pp = get("http://www.domain.com/something_something");
$out[0]="/home/.../public_html/perl_output.txt";
($firstname) = ($str =~ /<td id="firstname" class="value">(.+?)<\/firstname/);
($surname) = ($str =~ /<td id="surname" class="value">(.+?)<\/surname/);
($email) = ($str =~ /<td id="email" class="value">(.+?)<\/email/);
($telephone) = ($str =~ /<td id="telephone" class="value">(.+?)<\/telephone/);

print "First Name: $firstname \n";
print "Last Name: $surname \n";
print "Email: $email \n";
print "Telephone: $telephone \n";

exit;
$pp=get(“http://www.domain.com/something_something");
$out[0]=“/home/../public\u html/perl\u output.txt”;
($firstname)=($str=~/(.+?)此答案解决了问题中描述的问题,但不是OP在评论中揭示的实际问题。
因为Web::Scraper是用于HTML文档的,所以它不适用于OP想要刮取的网站。它使用XML。有关处理XML的解决方案,请参阅


!请改用HTML解析器

对于网页抓取,我更喜欢。它能以非常简单的方式完成从抓取页面到解析内容的所有工作

如果其中一个字段(如email或firstname)在一个表中多次出现,则可以使用数组引用。在这种情况下,文档的HTML将无效,因为有双
id
s。请使用其他选择器并祈祷它能工作

 process '#email', 'email[]' => 'TEXT';
现在您将得到这种结构:

{
  email => [
   'foo@example.org',
   'bar@example.org',
  ],
}
这个答案解决了问题中描述的问题,但不是OP在评论中揭示的实际问题。 因为Web::Scraper是用于HTML文档的,所以它不适用于OP想要刮取的网站。它使用XML。有关处理XML的解决方案,请参阅


!请改用HTML解析器

对于网页抓取,我更喜欢。它能以非常简单的方式完成从抓取页面到解析内容的所有工作

如果其中一个字段(如email或firstname)在一个表中多次出现,则可以使用数组引用。在这种情况下,文档的HTML将无效,因为有双
id
s。请使用其他选择器并祈祷它能工作

 process '#email', 'email[]' => 'TEXT';
现在您将得到这种结构:

{
  email => [
   'foo@example.org',
   'bar@example.org',
  ],
}
,这是一个使用XML解析器处理它的解决方案,它还考虑了多个字段。这非常有用,它甚至可以让我们下载文档

use strict;
use warnings;
use XML::Twig;
use Data::Printer;

my @docs; # we will save the docs here
my $twig = XML::Twig->new(
    twig_handlers => {
        'oai_dc:dc' => sub {
            my ($t, $elt) = @_;

            my $foo = {
                # grab all elements of type 'dc:author" inside our 
                # element and call text_only on them
                author => [ map { $_->text_only } $elt->descendants('dc:author') ],
                email => [ map { $_->text_only } $elt->descendants('dc:email') ],
            };

            push @docs, $foo;
        }
    }
);

$twig->parseurl("http://ejeps.com/index.php/ejeps/oai?verb=ListRecords&metadataPrefix=oai_dc");

p @docs;

__END__

[
    [0]  {
        author   [
            [0] "Nazila Isgandarova"
        ],
        email    [
            [0] "azerwomensc@yahoo.ca"
        ]
    },
    [1]  {
        author   [
            [0] "Mette Nordahl Grosen",
            [1] "Bezen Balamir Coskun"
        ],
        email    [
            [0] "m.grosen@gmail.com",
            [1] "bezenbalamir@gmail.com"
        ]
    },
# ...
,这是一个使用XML解析器处理它的解决方案,它还考虑了多个字段。这非常有用,它甚至可以让我们下载文档

use strict;
use warnings;
use XML::Twig;
use Data::Printer;

my @docs; # we will save the docs here
my $twig = XML::Twig->new(
    twig_handlers => {
        'oai_dc:dc' => sub {
            my ($t, $elt) = @_;

            my $foo = {
                # grab all elements of type 'dc:author" inside our 
                # element and call text_only on them
                author => [ map { $_->text_only } $elt->descendants('dc:author') ],
                email => [ map { $_->text_only } $elt->descendants('dc:email') ],
            };

            push @docs, $foo;
        }
    }
);

$twig->parseurl("http://ejeps.com/index.php/ejeps/oai?verb=ListRecords&metadataPrefix=oai_dc");

p @docs;

__END__

[
    [0]  {
        author   [
            [0] "Nazila Isgandarova"
        ],
        email    [
            [0] "azerwomensc@yahoo.ca"
        ]
    },
    [1]  {
        author   [
            [0] "Mette Nordahl Grosen",
            [1] "Bezen Balamir Coskun"
        ],
        email    [
            [0] "m.grosen@gmail.com",
            [1] "bezenbalamir@gmail.com"
        ]
    },
# ...

首先,您确实应该使用XML解析器

现在,我们来看看代码不起作用的一些可能原因:

您的正则表达式需要一个结束标记,例如
]+#除'>'以外的任何内容
>

([^首先,您确实应该使用XML解析器

现在,我们来看看代码不起作用的一些可能原因:

您的正则表达式需要一个结束标记,例如
]+#除'>'以外的任何内容
>

([^注意:我没有运行此代码,因为没有提供真正的URL,而且Web::Scraper不能很好地处理
\uuuu DATA\uuuuu
。非常感谢,如果有超过1个电子邮件地址和电话号码,代码会是什么样子。foreach代码应该以某种方式包括在内,不是吗?请给我们一个包含多个值的HTML示例。@esqeudero:是的,我们需要示例数据。这取决于它是否规范化。例如,我想从链接()的现有元数据中获取每个已发表论文(文章)的值我只需要这些价值,但可能会有1个以上的作者:我只需要这些价值,我只需要这些价值,但可能会有1个以上的1个以上的作者:我只需要这些价值,我只需要这些价值,但我只需要这些价值,但可能会有1个以上的1个以上的1个以上的1个作者:我只需要这些价值,我只需要有1个以上的1个以上的1个作者:我只需要我只需要有1个以上的1个以上的1个以上的1个以上的人:我需要。我只需要我只需要我需要我只需要我只需要我的1个以上的1个以上的1个以上的1个以上的人:我。我只需要我需要我只需要我需要我的人:我只需要我只需要我只需要我只需要有1个以上的1个以上的1个以上的人:我的人:我需要。我只需要我只需要我需要我只需要我的人:我只需要:我的1个以上的人数据公司de>。非常感谢,如果有超过1个电子邮件地址和电话号码,代码会是什么样子。foreach代码应该以某种方式包含,不是吗?给我们一个包含多个值的HTML示例。@esqeudero:是的,我们需要示例数据。这取决于它是否规范化。例如,我想获得每个已发布pape的值链接()处现有元数据中的rs(文章)。我只需要这些值,但可能不止一个作者:#dc#U title#dc#U author#dc#U affiliation#dc#email#dc#jel#dc#U关键字#dc#U description#dc#格式#dc#dc#U源#dc#dc#年#dc#dc#dc#卷#dc#dc#dc#dc#dc#dc#发行#dc#dc#dc#dc#dc