Bio.Entrez.Parser.ValidationError:无法在DTD中找到标签'Build'

时间:2012-10-18 07:56:25

标签: biopython

我刚刚安装了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。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

因此,Biopython的一些黑客攻击显示问题是因为'build'标签名称。

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

<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 $

我的猜测是从那时起添加了构建标记,但此文件从未更新以反映出来。