我目前正在将书目信息从 XML 结构整理为几乎任何其他可用的内容。我的最后一步是提取“xml:id”属性的值并将其添加到我的漂亮数据框中。我在 ElementTree 中和 python 中的 pandas 中都运行良好。
例如:我想从下面的 biblStruct 中提取“Kakawa2014”:
<biblStruct type="book" xml:id="Kagawa2014" corresp="http://zotero.org/users/local/fmahZILk/items/EAK64XAU">
<monogr>
#blahblah
</monogr>
</biblStruct>
我尝试了一些在堆栈溢出时发现的东西:
for biblStruct in root.findall('.//tei:biblStruct', namespace):
id_elem = biblStruct.attrib('xml:id')
并收到TypeError:“dict”对象不可调用 我对此抱有很大的希望:
for biblStruct in root.findall('.//tei:biblStruct', namespace):
id_elem = biblStruct.get('{http://w3.org/XML/1998/namespace}id')
id_text = id_elem.text if id_elem is not None else ''
xmlID.append(id_text)
data = {
'XML_ID':xmlID
}
df = pd.DataFrame(data)
print(df)
这返回了一个 DF,它刚刚计算了 biblStructs(正确的数字)(即 0,1,2,3,4 等) 还有:
for biblStruct in root.findall('.//tei:biblStruct', namespace):
id_elem = biblStruct.get('{http://w3.org/XML/1998/namespace}id')
xmlID.append(id_elem)
data_again = {
'XML_ID': xmlID
}
df_again = pd.DataFrame(data_again)
print(df_again)
这返回了与上面类似的 DF,只是现在,数量是原来的两倍!就像魔法一样。
这个问题很难回答。不是因为它很复杂,而是因为您的示例(XML 和 Python)不完整,因此我们无法运行您拥有的示例。我们没有最小且可重复的样本;我们必须从头开始。
我离题了...
您想要获取的是属性值。不是元素值(因此不会有任何
.text
属性)。
您(可能)接近最初的尝试(未经测试,因为我没有时间从头开始)。
.attrib
是一本字典,因此您可以像字典一样访问它......
for biblStruct in root.findall('.//tei:biblStruct', namespace):
id_attr = biblStruct.attrib['{http://www.w3.org/XML/1998/namespace}id']
或者(我认为更好)...
id_attr = biblStruct.get('{http://www.w3.org/XML/1998/namespace}id')