cElementTree 从 XML python 中提取数据
cElementTree to extract data from XML python
我有一个 XML 文件,其结构类似于以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<drugbank xmlns="http://www.drugbank.ca" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.drugbank.ca http://www.drugbank.ca/docs/drugbank.xsd" version="5.0" exported-on="2017-12-20">
<drug type="biotech" created="2005-06-13" updated="2017-11-06">
<drugbank-id primary="true">DB00001</drugbank-id>
<drugbank-id>BTD00024</drugbank-id>
<drugbank-id>BIOD00024</drugbank-id>
<cas-number>138068-37-8</cas-number>
<name>Lepirudin</name>
</drug>
<drug type="biotech" created="2005-06-13" updated="2017-11-06">
<drugbank-id primary="true">DB00045</drugbank-id>
<drugbank-id>BTD00054</drugbank-id>
<drugbank-id>BIOD00054</drugbank-id>
<cas-number>205923-56-4</cas-number>
<name>Lyme disease vaccine (recombinant OspA)</name>
</drug>
</drugbank>
我正在尝试使用Python 3的cElementTree模块。我想在这个XML中提取每种药物的名称,为此我编写了以下代码:
import xml.etree.cElementTree as ET
tree = ET.parse('fulldatabase.xml')
drugbank = tree.getroot()
print(drugbank.tag)
for drug in drugbank:
print(drug.find('name').text)
我得到的错误是AttributeError: 'NoneType' object has no attribute 'text'
我也试过检查 但 OP 在其中写的答案对我不起作用。有没有办法从每种药物中获取 name
和 cas-number
字段。我已经尝试了一些组合,比如在 for 循环条件中删除 findall()
,但即使那样对我来说也不起作用。
除了名字你还需要什么吗?如果不是这样就可以了。您没有正确使用文件 <drugbank xmlns="http://www.drugbank.ca"
部分中定义的 xml
命名空间
for drug in drugbank.iter('{http://www.drugbank.ca}name'):
print drug.text
Lepirudin
Lyme disease vaccine (recombinant OspA)
这是获取所需元素的另一种方法:
for child in drugbank.getchildren():
print {'cas-number': child.find('{http://www.drugbank.ca}cas-number').text, 'name': child.find('{http://www.drugbank.ca}name').text}
{'cas-number': '138068-37-8', 'name': 'Lepirudin'}
{'cas-number': '205923-56-4', 'name': 'Lyme disease vaccine (recombinant OspA)'}
我有一个 XML 文件,其结构类似于以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<drugbank xmlns="http://www.drugbank.ca" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.drugbank.ca http://www.drugbank.ca/docs/drugbank.xsd" version="5.0" exported-on="2017-12-20">
<drug type="biotech" created="2005-06-13" updated="2017-11-06">
<drugbank-id primary="true">DB00001</drugbank-id>
<drugbank-id>BTD00024</drugbank-id>
<drugbank-id>BIOD00024</drugbank-id>
<cas-number>138068-37-8</cas-number>
<name>Lepirudin</name>
</drug>
<drug type="biotech" created="2005-06-13" updated="2017-11-06">
<drugbank-id primary="true">DB00045</drugbank-id>
<drugbank-id>BTD00054</drugbank-id>
<drugbank-id>BIOD00054</drugbank-id>
<cas-number>205923-56-4</cas-number>
<name>Lyme disease vaccine (recombinant OspA)</name>
</drug>
</drugbank>
我正在尝试使用Python 3的cElementTree模块。我想在这个XML中提取每种药物的名称,为此我编写了以下代码:
import xml.etree.cElementTree as ET
tree = ET.parse('fulldatabase.xml')
drugbank = tree.getroot()
print(drugbank.tag)
for drug in drugbank:
print(drug.find('name').text)
我得到的错误是AttributeError: 'NoneType' object has no attribute 'text'
我也试过检查 name
和 cas-number
字段。我已经尝试了一些组合,比如在 for 循环条件中删除 findall()
,但即使那样对我来说也不起作用。
除了名字你还需要什么吗?如果不是这样就可以了。您没有正确使用文件 <drugbank xmlns="http://www.drugbank.ca"
部分中定义的 xml
命名空间
for drug in drugbank.iter('{http://www.drugbank.ca}name'):
print drug.text
Lepirudin
Lyme disease vaccine (recombinant OspA)
这是获取所需元素的另一种方法:
for child in drugbank.getchildren():
print {'cas-number': child.find('{http://www.drugbank.ca}cas-number').text, 'name': child.find('{http://www.drugbank.ca}name').text}
{'cas-number': '138068-37-8', 'name': 'Lepirudin'}
{'cas-number': '205923-56-4', 'name': 'Lyme disease vaccine (recombinant OspA)'}