2012-10-18 31 views
3

我剛安裝了Biopython並想試用它的功能,所以我開始瀏覽本教程。Bio.Entrez.Parser.ValidationError:在DTD中找不到標籤'Build'

但是,當我到達關於從Entrez獲取信息的章節時,遇到了一個問題。

本教程中的例子很簡單:

from Bio import Entrez 
Entrez.email = "[email protected]" 
handle = Entrez.einfo(db="pubmed") 
record = Entrez.read(handle) 

這工作得很好。但只要我想分析不同的數據庫考研我獲得以下錯誤:

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. 

嘗試驗證= False選項也不起作用,因爲這引起了Bio.Entrez.Parser.NotXMLError。

有人能告訴我我做錯了什麼,如何解決這個問題?

回答

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 $ 

我的猜測是自那時起已經添加了構建標記,但是這個文件從未被更新以反映這一點。

3

爲了克服這個問題,簡單地改變您的來電Entrez.read()包括一個驗證參數,像這樣:

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

對方回答這個問題是對的。這是Biopython解析器中的一個缺陷。希望他們很快會更新。