【发布时间】:2021-11-27 23:50:28
【问题描述】:
我有一个这样的 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 不能正常工作。欢迎任何想法。
【问题讨论】:
-
嗨。欢迎来到 StackOverflow。是否所有对 crossRefDb 元素的处理都相互独立,或者如果给定的残基有子 crossRefDb dbresnum = "null",则该残基组中的所有 crossRefDb 元素都被忽略了吗?为什么 dbResNum=1 未包含在您的预期输出中?
-
您好,谢谢您的欢迎。所以是的,如果我在与 dbSource="PDB" 相同的行中的 dbresnum 中得到一个空值,它将跳过该孩子的任何 dbresnum。所以,脚本应该忽略第一个孩子,因为它在 dbresnum 中得到一个空值
标签: python python-3.x xml beautifulsoup xml-parsing