2012-05-18 43 views
1

我有代表蛋白质的ID代码。有一个名为InterPro的网站,用于处理蛋白质相关信息。该网站的URL包含该特定的代码。通过更改该URL中的代码,我可以获得有关任何蛋白质的信息。我在perl中开发了一个脚本来直接从网上获取信息。我用下面的代码perl:扩展代码以从网站获取特定信息

my $uniprot= "P15700"; 
    my $resp= ''; 
    my $url= "http://wwwdev.ebi.ac.uk/interpro/ISearch?query=$uniprot+"; 
    my $file = "$uniprot"; 
    $resp = getstore($url, $file); 


exit; 
} 

在这个例子中P15700是该蛋白的独特的ID和URL是http://wwwdev.ebi.ac.uk/interpro/ISearch?query=P15700+。现在这将检​​索整个html页面。但是,我需要在“蛋白质家族成员”标题下的该页面上提供特定信息。就像在这个例子中一样如果你打开这个链接,你可以在蛋白质家族成员的标题下找到“腺苷酸激酶”。我只需要在另一个输出文本文件中显示一个表格,其中一列表示ID,另一列表示蛋白质家族成员资格下的信息。 我是新来的Perl,我没有计算机科学背景。相反,我是一名生物学家。所以,我想知道上面提到的任务是否可以用perl来完成。如果是,如何? 如果有人能解决这个问题,我将不胜感激。

+4

为什么要解析HTML,当你在你的手得到了无数Webservices的sleepdelay?看看[dbfetch](http://www.ebi.ac.uk/Tools/dbfetch/)工具([example](http://www.ebi.ac.uk/Tools/dbfetch/dbfetch?db = uniprotkb&id = P15700&format = annot&style = default&Retrieve = Retrieve)) - 如果它是“只是”Interpro已经有[Perl客户端](http://www.ebi.ac.uk/Tools/webservices/services/pfa/ iprscan_rest)。然后是[BioPerl](https://metacpan.org/module/BioPerl) - 特别是[Bio :: Index :: EMBL](https://metacpan.org/module/Bio::Index::EMBL)。 –

+0

Sebastian Stumpf,通过实际的代码示例来回答问题的要求,并保证有一个满意的答案。 – daxim

回答

0

甚至没有性感,但它的工作原理(基于HTML :: Treebuilder模块) - 你必须解析HTML并提取信息。在这个例子中,结果会被存储为文件“的Result.txt” CSV

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

my $uniprot= "P15700"; 
my $url= "http://wwwdev.ebi.ac.uk/interpro/ISearch?query=$uniprot+"; 
my $resp = get($url); 

my $tree = HTML::TreeBuilder->new_from_content($resp); 
my $first=$tree->look_down(_tag => 'div',class => 'prot_fam') ; 
$first=$first->look_down(_tag => 'div',class => 'entry-parent'); 
$first=$first->look_down(_tag => 'div',class => 'entry-parent'); 
$first=$first->look_down(_tag => 'a'); 
open (FH,">>result.txt"); 
print FH $uniprot.";"; 
print FH $first->content_list; 
print FH "\n"; 
close(FH); 

编辑: 下面是检查“uniprots”的很多的变体。玩弄

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

my @ports=qw(Q9H4B7 Q96RI1 P04150 P35354 P23219 P61073 P0A3M6 Q8DR59 Q7CRA4 Q27738 P35367 P35367 P35367 P08172 P35367 P10275 P25021 P07550 P08588 P13945); 

for (my $i=0;$i < scalar(@ports);$i++) { 
my $url= "http://wwwdev.ebi.ac.uk/interpro/ISearch?query=".$ports[$i]."+"; 
my $resp = get($url); 

my $tree = HTML::TreeBuilder->new_from_content($resp); 
my $first=$tree->look_down(_tag => 'div',class => 'prot_fam') ; 
$first=$first->look_down(_tag => 'div',class => 'entry-parent'); 
$first=$first->look_down(_tag => 'div',class => 'entry-parent'); 
$first=$first->look_down(_tag => 'a'); 
open (FH,">>result.txt"); 
print FH $ports[$i].";"; 
print FH $first->content_list; 
print FH "\n"; 
close(FH); 
sleep 10; 
} 
+0

谢谢。有效。 – shpr

+0

我使用上面提到的脚本来获取少量代码的列表。列表在另一个文本文件中,我使用slrup。它适用于很少的代码。但是,我用了一个更大的列表停止工作。错误消息是**无法调用方法“look_down”在行'$ first = $ first-> look_down(_tag =>'div',class =>'entry-parent');' **我不能找出问题在哪里?请帮助 – shpr

+0

请给我一个列表/查询的例子。 – int2000

0

Everything can be done using Perl :)至于这个特殊的问题,看看this question of mine concerning recursive web download and DOM code

由于您不是程序员,因此大部分内容都将成为您的新闻。

让我们首先了解DOM。这是查看网页时在浏览器中构建的HTML树。无论您使用的是哪一款,您都可以获得对Firebug或Chrome,IE和Opera的等效插件或内置插件的DOM玩法的正确理解。

因此,您将不得不转到此页面并分析其DOM。它看起来像你正在寻找的信息是在<div class="prot_fam">元素。所以,这就是你需要编写的代码的所有信息:

D:\ :: more /t2 prot.pl 
use strict; 
use warnings; 
use LWP::UserAgent; 
use HTML::TreeBuilder::XPath; 

my $url = shift || die 'pass URL as argument!'; 
my $file = shift || die 'pass output filename as argument!'; 

my $ua = LWP::UserAgent->new; 
my $rsp = $ua->mirror($url, $file); 
if (! $rsp->is_success) { 
    die $rsp->status_line; 
} 

my $tree = HTML::TreeBuilder::XPath->new; 
$tree->parse_file($file) or die; 

print $_, "\n" for map $_->as_XML_indented, 
$tree->findnodes(q(//div[@class='prot_fam'])); 

D:\ :: perl prot.pl http://wwwdev.ebi.ac.uk/interpro/ISearch?query=P15700 P15700.html 
<div class="prot_fam"> 
    <div class="entry-parent"> 
    <div class="entry-parent"> 
    <a href="IEntrySummary?ac=IPR000850&amp;query=P15700">Adenylate kinase</a> 
     <div class="entry-child-prot"> 
     <div class="entry-parent"> 
     <a href="IEntrySummary?ac=IPR006266&amp;query=P15700">UMP-CMP kinase</a> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 

添加使用Mojo::DOM

use strict; 
use warnings; 
use LWP::UserAgent; 
use Mojo::DOM; 
my $url = shift || die 'URL!'; 
my $ua = LWP::UserAgent->new; 
my $rsp = $ua->get($url); 
my $dom = Mojo::DOM->new($rsp->content); 
for ($dom->find('div[class="prot_fam"]')->each) { 
    print $_->find('a'), "\n"; 
} 
+0

谢谢。它帮助我很好地理解它。 – shpr

2

这涉及到解析网页的HTML这IMO很少是一个好主意,另一个样本。该页面可能会随时更改,这会导致脚本停止正常工作。如果你仍然有兴趣,这里的解决方案:

use Mojo::DOM;  
my $dom = Mojo::DOM->new($resp); 
my $name = $dom->find('div.prot_fam a')->[0]->text; 

现在$name变量将举行Adenylate kinase字符串。

+0

Wohoo ......这真的很棒 - 3行 - 尊敬!但是我从来没有听说过5MB的模块? – int2000

+1

你说过:“这涉及到使用Perl解析网页HTML,而IMO很少是个好主意”。我认为你的意思可能是“这涉及解析网页HTML,而IMO很少是个好主意”。在Perl中没有任何关于屏幕抓取的东西,这使得它不像任何其他语言那样是一个好主意。 IMO :) –

+0

@DaveCross接受。感谢您的观点:) – nab

4
use strictures; 
use Web::Query 'wq'; 
my $w = wq 'http://wwwdev.ebi.ac.uk/interpro/ISearch?query=P15700+'; 
$w->find('.prot_fam a')->text; 
# expression returns: 
# (
#  'Adenylate kinase', 
#  'UMP-CMP kinase', 
#) 
+0

我对这一切都很陌生。你介意告诉我什么是狭隘的? – shpr

+0

[strictures](http://p3rl.org/strictures),[为什么使用strict和warnings?](http://stackoverflow.com/questions/8023959/why-use-strict-and-warnings),[Use严格和警告](http://www.perlmonks.org/?node_id=111088) – daxim

+0

哦,我明白了。谢谢 – shpr