3

我刚刚安装了 Biopython 并想尝试它的功能,所以我开始阅读教程。

然而,当我到达关于从 Entrez 获取信息的章节时,我遇到了一个问题。

教程中的示例很简单:

from Bio import Entrez
Entrez.email = "A.N.Other@example.com"
handle = Entrez.einfo(db="pubmed")
record = Entrez.read(handle)

这工作正常。但是,一旦我想解析与 pubmed 不同的数据库,我就会收到以下错误:

Bio.Entrez.Parser.ValidationError: Failed to find tag 'Build' in the DTD. To skip all tags that are not represented in the DTD, please call Bio.Entrez.read or Bio.Entrez.parse with validate=False.

尝试 validate=False 选项也不起作用,因为这会引发 Bio.Entrez.Parser.NotXMLError。

有人可以告诉我我做错了什么以及如何解决这个问题?

4

2 回答 2

3

为了解决这个问题,只需将您的调用更改Entrez.read()为包含验证参数,如下所示:

record = Entrez.read(handle,validate=False)

这个问题的另一个答案是正确的。这是 Biopython 解析器中的一个错误。希望他们能尽快更新。

于 2012-11-03T16:48:07.643 回答
2

这不是一个真正有效的解决方案,但显示了问题所在。我认为这可能是 biopython (Entrez.Parse) 错误,所以我会与他们取得联系,看看他们的想法。

因此,Biopython 的一些黑客行为表明问题在于“构建”标签名称。

如果我们手动执行此操作,XML 请求的前几行pubmed如下所示

<eInfoResult>
  <DbInfo>
    <DbName>pubmed</DbName>
    <MenuName>PubMed</MenuName>
    <Description>PubMed bibliographic record</Description>
    <Count>22224084</Count>
    <LastUpdate>2012/10/30 03:30</LastUpdate>
    ....

但是蛋白质请求看起来像这样;

<eInfoResult>
  <DbInfo>
    <DbName>protein</DbName>
    <MenuName>Protein</MenuName>
    <Description>Protein sequence record</Description>
    <Build>Build121030-0741m.1</Build>                   <-------- THIS IS BAD
    <Count>59244879</Count>
    <LastUpdate>2012/10/30 18:39</LastUpdate>

我看了一下 Entrez.Parser 的工作原理,它基本上无法识别build标签。进一步生根显示标签是在 DTD 文件和 einfo DTD 文件中定义的,在我的系统上是这里;

/usr/local/lib/python2.7/dist-packages/Bio/Entrez/DTDs

如果我们检查相关文件eInfo_020511.dtd并添加一个构建标记行(下面带有箭头的行以前不存在);

<!--    
                This is the Current DTD for Entrez eInfo
$Id: eInfo_020511.dtd,v 1.1 2008-05-13 11:17:44 mdehoon Exp $
-->
<!-- ================================================================= -->

<!ELEMENT   DbName      (#PCDATA)>  <!-- \S+ -->
<!ELEMENT   Name        (#PCDATA)>  <!-- .+ -->
<!ELEMENT   FullName    (#PCDATA)>  <!-- .+ -->
<!ELEMENT   Description (#PCDATA)>  <!-- .+ -->
<!ELEMENT   Build       (#PCDATA)>  <!-- .+ -->     <------- I ADDED THIS LINE
<!ELEMENT   TermCount   (#PCDATA)>  <!-- \d+ -->
<!ELEMENT   Menu        (#PCDATA)>  <!-- .+ -->

现在可以了。对该文件的评论表明它自 2008 年以来没有更新(下面的行来自 DTD 标头)。

 $Id: eInfo_020511.dtd,v 1.1 2008-05-13 11:17:44 mdehoon Exp $

我的猜测是,从那时起就添加了构建标签,但该文件从未更新以反映这一点。

于 2012-10-31T05:53:11.960 回答