【发布时间】:2013-03-29 18:45:50
【问题描述】:
我正在解析一个大小合适的 xml 文件,但遇到了问题。出于某种原因,即使我之前在不同的 xml 文件上做过 完全相同的事情,我也无法提取数据。
这是我的代码的 sn-p:(程序的其余部分,我已经测试过,它们工作正常) 编辑:更改为包含测试 try&except 块
def parseXML():
file = open(str(options.drugxml),'r')
data = file.read()
file.close()
dom = parseString(data)
druglist = dom.getElementsByTagName('drug')
with codecs.open(str(options.csvdata),'w','utf-8') as csvout, open('DrugTargetRel.csv','w') as dtout:
for entry in druglist:
count = count + 1
try:
drugtype = entry.attributes['type'].value
print count
except:
print count
print entry
drugidObj = entry.getElementsByTagName('drugbank-id')[0]
drugid = drugidObj.childNodes[0].nodeValue
drugnameObj = entry.getElementsByTagName('name')[0]
drugname = drugnameObj.childNodes[0].nodeValue
targetlist = entry.getElementsByTagName('target')
for target in targetlist:
targetid = target.attributes['partner'].value
dtout.write((','.join((drugid,targetid)))+'\n')
csvout.write((','.join((drugid,drugname,drugtype)))+'\n')
如果您想知道 XML 文件的架构大致是什么样子,这里有一个粗略的可怕的关卡草图:
<drugs>
<drug type='something' ...>
<drugbank-id>
<name>
...
<targets>
<target partner='something'>
我在这里输入的内容,我需要从 XML 文件中提取并将其粘贴到 csv 文件中(如上面的代码所示),并且该代码以前适用于不同的 xml 文件,不知道为什么它不起作用这个。我在'type'上得到了KeyError,即使每种药物都有一个drugid,我也得到了提取drugid的在线索引错误。我在这里搞砸了什么?
编辑:我提取的东西保证在每种药物中都有。
对于任何关心的人,这里是我正在解析的 XML 文件的链接: http://www.drugbank.ca/system/downloads/current/drugbank.xml.zip
编辑:在实现 try & except 块(见上文)后,我发现: 在架构中,有一些称为“药物相互作用”的部分也有一个称为药物的子字段。像这样:
<drugs>
<drug type='something' ...>
<drugbank-id>
<name>
...
<targets>
<target partner='something'>
<drug-interactions>
<drug>
我认为我的行 druglist = dom.getElementsByTagName('drug') 也无意中捡起了这些 - 我不知道如何解决这个问题......有什么建议吗?
【问题讨论】:
-
能否包含错误的堆栈跟踪?
-
是的,编辑了我遇到的最近的 2 个错误,除了添加/删除打印语句之外没有改变太多其他内容。
-
您的代码假定记录始终具有您认为的格式。 KeyError 仅表示 drug 元素没有 type 属性。 IndexError 的类似问题...记录没有您想要的信息。尝试将“for entry in druglist:”块放入 try/except 块,然后打印导致问题的条目。看起来对吗?从长远来看,除了处理程序会实施您的失败策略(继续处理、报告记录或其他)。
-
@tdelaney 起初我认为这可能是导致错误的原因,但是当我检查数据时,每个药物字段都带有类型属性,并且每个药物都必须带有药物 ID 和药物名称。即使使用数据源,我也检查了这一点。他们每个人都必须在那里。这就是我难过的原因。我将放入一个 try/except 块并进行更多检查。
-
@Joe 如果drugs 是一个根元素,它只有drug 作为后续元素,在drugs 上使用childNodes 而不是getElementsByTagName。
标签: python xml parsing text-parsing