1 回答

TA貢獻1810條經驗 獲得超4個贊
您的代碼失敗的原因是您的 XML 使用默認命名空間 ( xmlns="http://..." )。
但是您對findall 的調用包含沒有任何名稱空間的紀元 ,因此它不太可能找到任何東西。
要處理命名空間的XML,您必須:
創(chuàng)建已用名稱空間的字典({prefix: namespace}),
在 XPath 表達式中包含相關命名空間的前綴,
將上述字典作為findall的第二個參數傳遞。
就像是:
ns = {'ep': 'http://www.egi.com/epochs_mff'}
epoch_list = tree.findall('ep:epoch', ns)
那么結果是:
[<Element '{http://www.egi.com/epochs_mff}epoch' at 0x...>]
要獲取endTime元素的內容,如果您不關心 XML 樹中的任何中間元素,請運行:
tree.findtext('.//ep:endTime', namespaces=ns)
另一種選擇是傳遞完整的 XML 路徑,從根元素的內容開始,但請記住每一步的命名空間前綴:
tree.findtext('ep:epoch/ep:endTime', namespaces=ns)
如果您有多個 endTime元素,一種可能的解決方案是在循環(huán)中處理它們。
這次findtext沒有用,因為它只找到第一個匹配的元素。您應該使用基于findall的循環(huán),然后(在循環(huán)內)檢索當前元素的文本并按預期使用它,例如:
for it in tree.findall('ep:epoch/ep:endTime', namespaces=ns):
print(it.text)
當然,將print替換為您需要使用找到的文本的任何內容。
添加回答
舉報