我正在使用Bio :: DB :: EUtilities查询具有给定PMID的Pubmed DB(Pubmed Id)。
use Bio::DB::EUtilities;
use strict;
use warnings;
my @ids = (23298400);
my $factory = Bio::DB::EUtilities->new(-eutil => 'efetch',
-email => 'mymail@foo.bar',
-db => 'pubmed',
-retmode => 'xml',
-id => \@ids);
$factory -> get_Response(-file => 'pubmed_response.xml');
有没有办法直接访问对象(例如抽象)而不是将响应写入文件并使用XML :: Twig左右?
答案 0 :(得分:2)
如果您正在寻找像$factory->get_abstract
这样的对象方法,它就不存在了。使用esummary
将告诉您条目是否具有摘要。例如,
#!/usr/bin/env perl
use 5.010;
use strict;
use warnings;
use Bio::DB::EUtilities;
my @ids = (23298400);
my $factory = Bio::DB::EUtilities->new(-eutil => 'esummary',
-email => 'mymail@foo.bar',
-db => 'pubmed',
-retmode => 'xml',
-id => \@ids);
while (my $doc = $factory->next_DocSum) {
while (my $item = $doc->next_Item('flattened')) {
if ($item->get_name eq 'HasAbstract') {
printf("%-20s: %s\n",$item->get_name,$item->get_content) if $item->get_content;
}
}
}
这只是打印HasAbstract : 1
。如果你想得到摘要,有几个选项。一种方法是使用efetch
返回xml,你可以存储内容而不是写入my $xml = $factory->get_Response->content
的文件,然后在其中查找“抽象”节点。
#!/usr/bin/env perl
use 5.010;
use utf8;
use strict;
use warnings;
use Bio::DB::EUtilities;
use XML::LibXML;
my @ids = (23298400);
my $factory = Bio::DB::EUtilities->new(-eutil => 'efetch',
-email => 'mymail@foo.bar',
-db => 'pubmed',
-retmode => 'xml',
-id => \@ids);
my $xml = $factory->get_Response->content;
my $xml_parser = XML::LibXML->new();
my $dom = $xml_parser->parse_string($xml);
my $root = $dom->documentElement();
for my $node ($root->findnodes('//*[text()]')) {
my $name = $node->nodeName();
if ($name eq 'Abstract') {
for my $child ($node->findnodes('*')) {
binmode STDOUT, ":utf8";
say $child->textContent();
}
}
}
此代码打印摘要(这是我在biostars上提供的相同答案,但为了完整性将其包含在此处)。另一种选择是在Bash脚本中使用curl,或者在Perl脚本中使用LWP::UserAgent来自己构建查询。如果您查看EFetch的指南,可以看到可以将retmode
设置为“text”,将rettype
设置为“abstract”。此外,在“示例”部分下,几乎没有关于如何使用PMID形成查询以仅获取摘要文本的示例。
BioPerl方法可以让您访问更多信息,但您可能需要自己进行一些解析(或阅读API)。或者,如果这是你感兴趣的内容,你可以只获取摘要,但这种方法更有限,因为你只是得到摘要,而不是与出版物相关的其他信息。