我有这样一个xml文件:
data = """<entity type="protein" entityId="A">
<segment segId="7ddd_A_1_1208" start="1" end="1208">
<listResidue>
<residue dbSource="PDBe" dbCoordSys="PDBe" dbResNum="1" dbResName="MET">
<crossRefDb dbSource="PDB" dbCoordSys="PDBresnum" dbAccessionId="7ddd" dbResNum="null" dbResName="MET" dbChainId="A"/>
<crossRefDb dbSource="UniProt" dbCoordSys="UniProt" dbAccessionId="P0DTC2" dbResNum="1" dbResName="M"/>
<crossRefDb dbSource="NCBI" dbCoordSys="UniProt" dbAccessionId="2697049" dbResNum="1" dbResName="M"/>
<residueDetail dbSource="PDBe" property="Annotation">Not_Observed</residueDetail>
</residue>
<residue dbSource="PDBe" dbCoordSys="PDBe" dbResNum="14" dbResName="GLN">
<crossRefDb dbSource="PDB" dbCoordSys="PDBresnum" dbAccessionId="7ddd" dbResNum="14" dbResName="GLN" dbChainId="A"/>
<crossRefDb dbSource="UniProt" dbCoordSys="UniProt" dbAccessionId="P0DTC2" dbResNum="13" dbResName="Q"/>
<crossRefDb dbSource="NCBI" dbCoordSys="UniProt" dbAccessionId="2697049" dbResNum="14" dbResName="Q"/>
<residueDetail dbSource="PDBe" property="codeSecondaryStructure">T</residueDetail>
<residueDetail dbSource="PDBe" property="nameSecondaryStructure">loop</residueDetail>
</residue>
</entity>
<entity type="protein" entityId="B">
<segment segId="7ddd_B_1_1208" start="1" end="1208">
<listResidue>
<residue dbSource="PDBe" dbCoordSys="PDBe" dbResNum="1" dbResName="MET">
<crossRefDb dbSource="PDB" dbCoordSys="PDBresnum" dbAccessionId="7ddd" dbResNum="1" dbResName="MET" dbChainId="B"/>
<crossRefDb dbSource="UniProt" dbCoordSys="UniProt" dbAccessionId="PXCDT" dbResNum="1" dbResName="M"/>
<crossRefDb dbSource="NCBI" dbCoordSys="UniProt" dbAccessionId="2697049" dbResNum="1" dbResName="M"/>
<residueDetail dbSource="PDBe" property="Annotation">Not_Observed</residueDetail>
</residue>
<residue dbSource="PDBe" dbCoordSys="PDBe" dbResNum="16" dbResName="VAL">
<crossRefDb dbSource="PDB" dbCoordSys="PDBresnum" dbAccessionId="7ddd" dbResNum="16" dbResName="VAL" dbChainId="B"/>
<crossRefDb dbSource="UniProt" dbCoordSys="UniProt" dbAccessionId="P0DTC2" dbResNum="16" dbResName="V"/>
<crossRefDb dbSource="NCBI" dbCoordSys="UniProt" dbAccessionId="2697049" dbResNum="16" dbResName="V"/>
<residueDetail dbSource="PDBe" property="codeSecondaryStructure">T</residueDetail>
<residueDetail dbSource="PDBe" property="nameSecondaryStructure">loop</residueDetail>
</residue>"""
我试图做的是从与dbSource=“PDB”和dbSource=“UniProt”相同的行中检索dbResNum值。但是,只有在dbSource=“PDB”行中没有dbResNum=“null”,并且与dbSource=“UniProt”行中的dbAccessionId=“P0DTC2”没有任何不同的值时,我才需要这些值。所以,我的输出是这样的:
PDB_Res='13','16' Uniprot_Res='14,'16'
我尝试这样做的代码:
from bs4 import BeautifulSoup
import re
def not_null(dbresnum):
return dbresnum and not re.compile("null").search(dbresnum)
xml_file = BeautifulSoup(data, 'lxml')
XML_without_null = xml_file.find_all(dbresnum=not_null)
for cross in XML_without_null:
if cross('crossrefdb', {"dbaccessionid":"P0DTC2"}):
Uniprot_id = cross['dbresnum']
if cross('crossrefdb', {"dbsource":"PDB"}):
PDB_id = cross['dbresnum']
问题是函数not_null工作不正常。任何想法都欢迎
首先,需要将解析器从“lxml”更改为“xml”。
lxml是lxml.html.soupparser的别名,用于html
还要注意,您问题中的XML片段是一个无效的XML文件,没有结束段或ListResidence元素。没有根XML元素,只有2个无效的实体元素。BeautifulSoup处理无效文档,但如果可能,建议始终从有效的XML文档开始
如果要跳过整个剩余组和其中的所有交叉引用数据库子级,则需要迭代所有剩余并检查是否有任何子级交叉引用数据库在dbresnum中与dbSource=“PDB”在同一行中具有空值
试着这样做:
输出:
相关问题 更多 >
编程相关推荐