使用PERL从HTML表中获取值
我试图从已经存在的html表中使用精确的td(单元格)获取值。有人能帮我吗 现有表的代码如下所示。使用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
<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