我尝试访问和使用NCBI中的不同页面,例如
http://www.ncbi.nlm.nih.gov/nuccore/NM_000036
但是,当我使用perl的LWP :: Simple' get'功能,当我手动保存页面时,我没有获得相同的输出(使用firefox浏览器'另存为html'选项)。我从“获得”中得到了什么?功能缺乏我需要的数据。
我做错了吗? 我应该使用其他工具吗?
我的脚本是:
use strict;
use warnings;
use LWP::Simple;
my $input_name='GENES.txt';
open (INPUT, $input_name ) || die "unable to open $input_name";
open (OUTPUT,'>', 'Selected_Genes')|| die;
my $line;
while ($line = <INPUT>)
{
chomp $line;
print OUTPUT '>'.$line."\n";
my $URL='http://www.ncbi.nlm.nih.gov/nuccore/'.$line;
#e.g:
#$URL=http://www.ncbi.nlm.nih.gov/nuccore/NM_000036
my $text=gets($URL);
print $text."\n";
$text=~m!\r?\n\r?\s+\/translation="((?:(?:[^"])\r?\n?\r?)*)"!;
print OUTPUT $1."\n";
}
提前致谢!
答案 0 :(得分:3)
http://www.ncbi.nlm.nih.gov/nuccore/NM_000036的页面进行了大量的JavaScript处理,并动态加载了大量内容。 LWP :: UserAgent不会为您执行此操作,因为它无法运行JavaScript。
我建议您使用Firebug或Chrome开发者工具查看浏览器中发生的情况。您会看到它对此网址发出XHR请求:http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=289547499&db=nuccore&dopt=genbank&extrafeat=976&fmt_mask=0&retmode=html&withmarkup=on&log $ = seqview&amp; maxdownloadsize = 1000000
现在我不确定这些参数如何转换为NM_000036
,但你应该能够通过查看页面上运行的一些JS代码或尝试多个页面来解决这个问题。查看XHR调用的URL。
由于这可能是一项公共服务,并且我假设您可以获取该数据,因此您应该考虑询问他们是否拥有适当的API,而不是屏幕从网站上删除这些内容
答案 1 :(得分:1)
您正在搜索的内容由JavaScript生成。您需要解析HTML(来自第一个响应)并找到所需数据的ID:
<meta name="ncbi_uidlist" content="289547499" />
接下来,您需要以以下格式向网址发出另一个请求:http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=ID_YOU_HAVE
像这样(未经测试!): 我的$ URL =&#39; http://www.ncbi.nlm.nih.gov/nuccore/&#39;。$ line;
my $html=gets($URL);
my ($id) = $html =~m{name="ncbi_uidlist" \s+ content="([^"]+)"}xi;
if ($id) {
$html=gets( "http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?val=" . $id );
$text=~m!\r?\n\r?\s+\/translation="((?:(?:[^"])\r?\n?\r?)*)"!;
print OUTPUT $1."\n";
}