1

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

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

4

4 回答 4

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',
# )
于 2012-05-18T16:08:23.510 回答
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字符串。

于 2012-05-18T15:53:15.657 回答
0

一切都可以使用 Perl 完成 :)至于这个特殊问题,看看我的这个关于递归 Web 下载和 DOM 代码的问题

由于您不是程序员,因此其中大部分内容对您来说都是新闻。

让我们先了解一下 DOM。它是浏览网页时在浏览器中构建的 HTML 树。您可以对使用Firebug或 Chrome、IE 和 Opera 的等效插件或内置插件(无论您使用的是哪一个)进行适当的了解。

因此,您必须访问此页面并分析其 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";
}
于 2012-05-18T15:53:14.790 回答
0

甚至不性感,但它可以工作(基于 HTML::Treebuilder 模块)——你必须解析 HTML 并提取信息。在此示例中,结果将作为 csv 存储在文件“result.txt”中

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;
}
于 2012-05-18T15:54:32.740 回答