2012-05-18 90 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