2015-02-10 130 views
1

我是Perl新手,很难理解如何从搜索结果中获取特定值。例如,我想知道swiss-prottrembl的uniprot搜索结果的数量。我的代码是这样的:Perl - 从URL中获取特定信息

#use strict 
#use warnings 
use LWP::Simple; 

print "organism name: "; 
my $SPCount = <STDIN>; 
chomp($SPCount); 
$SPCount =~ s/ /%20/; 
$url = 'http://www.uniprot.org/uniprot/?query='.$SPCount.'&sort=score'; 
my $quelltext = get($url); 

比方说,我找“智人”,我会得到26138 SWISSPROT和919192个TREMBL结果。我应该解析这些数字的HTML文件吗?这是如何运作的?

+2

注释掉'使用strict'和'使用warnings'是一个非常糟糕的主意。他们在那里是有原因的。注意他们告诉你的。 – 2015-02-10 15:59:35

+0

这是真的,我以为我已经改变了已经 – satayan 2015-02-10 16:13:02

回答

4

您必须使用CPAN上的解析器之一解析返回的HTML。我的第一个选择是HTML::TreeBuilder::XPath,它是HTML::TreeBuilder的一个子类,它允许使用XPath表达式来处理结果数据结构。

综观问题的网页的HTML源代码,它看起来像你想有id属性reviewed-filterunreviewed-filter两个<a>元素的内容。这个程序演示了如何做到这一点。

use strict; 
use warnings; 
use 5.010; 

use LWP::Simple; 
use HTML::TreeBuilder::XPath; 

STDOUT->autoflush; 

my $organism = <> // 'homo sapiens'; 
chomp $organism; 
$organism =~ s/ /%20/g; 

my $url = "http://www.uniprot.org/uniprot/?query=$organism&sort=score"; 

my $tree = HTML::TreeBuilder::XPath->new_from_content(get($url)); 

say "Organism Name: $organism"; 
say ' ', join ' ', $tree->findnodes_as_strings('//a[@id="reviewed-filter"]/node()'); 
say ' ', join ' ', $tree->findnodes_as_strings('//a[@id="unreviewed-filter"]/node()'); 

输出

Organism Name: homo%20sapiens 
    Reviewed (26,138) Swiss-Prot 
    Unreviewed (919,192) TrEMBL 
+0

谢谢!工作很好! – satayan 2015-02-20 00:23:06