【发布时间】:2021-11-22 14:20:21
【问题描述】:
我有一个这样的 XML 文件:
data = '''<dbReference type="PDB" id="6LVN">
<property type="method" value="X-ray"/>
<property type="resolution" value="2.47 A"/>
<property type="chains" value="A/B/C/D=1168-1203"/>
</dbReference>
<dbReference type="PDB" id="6LXT">
<property type="method" value="X-ray"/>
<property type="resolution" value="2.90 A"/>
<property type="chains" value="A/B/C/D/E/F=910-988, A/B/C/D/E/F=1162-1206"/>
</dbReference>
<dbReference type="PDB" id="6LXV">
<property type="method" value="X-ray"/>
<property type="resolution" value="4.90 A"/>
<property type="chains" value="A/B/C/=210-488, A/B/C/=510-688, A/B/C=800-960"/>
</dbReference>'''
我想检索所有长度值。我这样做的代码:
from bs4 import BeautifulSoup
xml_file = BeautifulSoup(data, 'lxml')
pdbs_xml = xml_file.find_all('dbreference', {'type': 'PDB'})
if len(pdbs_xml) != 0:
for item in pdbs_xml:
if item.find('property'):
id_ = item['id']
chains = item.find('property', {'type': 'chains'})
chains2 = chains['value']
if chains2.find(",")!= -1:
count = chains2.count(',')
if count >= 2:
chains = chains['value'].split('=')[count]
chains = chains.split(',')[0]
first_aa = chains.split('-')[0]
last_aa = chains.split('-')[1]
size_pdb = int(last_aa) - int(first_aa)
else:
chains = chains['value'].split('=')[2]
first_aa = chains.split('-')[0]
last_aa = chains.split('-')[1]
size_pdb = int(last_aa) - int(first_aa)
else:
chains = chains['value'].split('=')[1]
first_aa = chains.split('-')[0]
last_aa = chains.split('-')[1]
size_pdb = int(last_aa) - int(first_aa)
如您所见,有些值是分开的。理论上,我可以创建一个语句来预测每种可能性并检索所有情况(我知道我的代码现在并没有完全做到这一点),但是有更好的方法来实现这一点。所以,欢迎提出任何建议。
【问题讨论】:
-
鉴于
dataxml - 应该是什么输出?什么是所有长度值。? -
你能举例说明“长度值”是什么意思吗?
-
我的想法是拥有每个 PDB 的大小。例如,PDB '6LVN' 的长度是 35 (1203 - 1168)。 PDB '6LXT' 的长度为 122 ([988 - 910] + [1206 - 1162])
标签: python python-3.x xml