使用 Microsoft Books.xml https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms762271(v=vs.85)
第一個條目的樣本。
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
</catalog>
試圖從具有奇數 id 的 id 中提取所有書名。將 id 和 title 捕獲為鍵,字典中的值
到目前為止,我已經完成了這項作業,除了所有標題都作為單個專案串列回傳。
import xml.etree.ElementTree as ET
tree = ET.parse('books.xml')
root = tree.getroot()
data = {}
for child in root.findall('book'):
for k,v in child.items():
for title in child.iter('title'):
if int(v.split('k')[1]) % 2 != 0:
if k not in data:
data[v] = []
data[v].append(title.text)
print(data['bk101'])
輸出
{'bk101': ["XML Developer's Guide"], 'bk103': ['Maeve Ascendant'], 'bk105': ['The Sundered Grail'], 'bk107': ['Splish Splash'], 'bk109': ['Paradox Lost'], 'bk111': ['MSXML3: A Comprehensive Guide']}
期望的輸出
{'bk101': "XML Developer's Guide", 'bk103': 'Maeve Ascendant', 'bk105': 'The Sundered Grail', 'bk107': 'Splish Splash', 'bk109': 'Paradox Lost', 'bk111': 'MSXML3: A Comprehensive Guide'}
如何將標題作為文本而不是串列回傳?
注意我可以將它們從我的字典中作為文本拉出來
print(data['bk101'][0])
但是,希望將它們作為文本保存到字典中,以后不提取。
編輯我意識到它是因為我在檢查鍵是否存在時創建一個串列作為默認值。但是,我們不能使用None型別作為占位符來避免串列副作用。
意識到我可能應該在這個答案中使用fromkeys來初始化一個帶有鍵和空值的字典
但是我如何在回圈中做到這一點?
uj5u.com熱心網友回復:
如果您不希望<title>每本書有多個標簽,則無需使用串列,您只需分配值title.text而不是附加它。child.items()此外,當您知道您特別需要該id屬性時,無需進行迭代。如果有其他屬性,它可能會導致問題,因為它們不會以相同的格式被拆分。
<book>基于每個人都有一個id和一個孩子的假設<title>(如您的示例 XML)的簡化代碼如下:
for child in root.findall('book'):
book_id = child.get('id')
if int(book_id.split('k')[1]) % 2 != 0:
data[book_id] = child.find('title').text
print(data)
這給出了輸出:
{'bk101': "XML Developer's Guide", 'bk103': 'Maeve Ascendant', 'bk105': 'The Sundered Grail', 'bk107': 'Splish Splash', 'bk109': 'Paradox Lost', 'bk111': 'MSXML3: A Comprehensive Guide'}
如果有可能<title>丟失,find()可以回傳None,因此需要額外的 if 條件。
如果您希望<title>每個標簽有多個標簽<book>,最好有一個串列并child.iter('title')在您的問題中使用 like 。這也將隱式處理丟失的標題大小寫,因為回圈內的代碼不會運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/450108.html
標籤:python-3.x lxml
下一篇:為什么我不能通過索引獲取字典鍵?
