Python - 使用 lxml 查找特定的 XML 元素
Python - Find specific XML element using lxml
背景:
我知道有人问过这个问题,但我真的很难找到正确的 Xpath 公式。我正在使用 iTunes XML 文件。所以 Apple 真的很烦他们如何格式化这个文件......他们没有制作标签,然后文本是 ID,他们只使用 , , 标签。这让试图找到正确的元素变得非常混乱。
我一直在尝试关注这个问题:Python ElementTree: find element by its child's text using XPath but it's just not working for me. I've been reading this (https://lxml.de/tutorial.html) 文档,但我没有找到我需要的答案。我相当确定 Xpath 是正确的选择,但我会采纳任何更好的建议。
我确实尝试过使用一些 iTunes 特定的库。看起来它们都已经过时了,或者只是没有按照我的需要工作。我最初使用的是 Elementtree,但是当 Apple 以这种方式格式化文件时,lxml 的 getnext() 功能是一个救星。
示例 XML 文件:
<plist version="1.0">
<dict>
<key>Library Persistent ID</key><string>6948B4402F0EEFFF</string>
<key>Tracks</key>
<dict>
<key>18051</key>
<dict>
<key>Track ID</key><integer>18051</integer>
<key>Size</key><integer>7930116</integer>
<key>Total Time</key><integer>196336</integer>
<key>BPM</key><integer>86</integer>
<key>Date Modified</key><date>2018-10-23T12:41:05Z</date>
<key>Date Added</key><date>2017-07-25T02:49:11Z</date>
</dict>
<key>18053</key>
<dict>
<key>Track ID</key><integer>18053</integer>
<key>Size</key><integer>9780560</integer>
<key>Total Time</key><integer>243513</integer>
<key>Year</key><integer>2010</integer>
<key>BPM</key><integer>74</integer>
<key>Date Modified</key><date>2018-10-23T12:41:09Z</date>
<key>Date Added</key><date>2017-07-25T02:49:11Z</date>
</dict>
<key>18055</key>
<dict>
<key>Track ID</key><integer>18055</integer>
<key>Size</key><integer>12995663</integer>
<key>Total Time</key><integer>323604</integer>
<key>Year</key><integer>2005</integer>
<key>BPM</key><integer>76</integer>
<key>Date Modified</key><date>2018-10-23T12:41:14Z</date>
<key>Date Added</key><date>2017-07-25T02:49:11Z</date>
</dict>
方法:
因此,假设我需要找到 ID 为“18053”的元素,而不是递归地遍历所有内容(我已经想出了如何做),如果我可以检查 ID #,效率会高得多。然后获取
之后的元素
我试过以下方法:
root = etree.parse(xml_file_path)
key_found = root.xpath("//key[text()='18053']")
element_wanted = key_found.getnext()
但是得到一个错误,因为 key_found 是一个列表,而不是一个元素。
使用查找,应该 return 一个元素,但使用以下内容:
key_found = root.find("//key[text()='18053']")
我收到错误“谓词错误”
感谢任何帮助。几天来我一直在研究这个。怪苹果!
谢谢!
xpath方法应该return一个列表,所以
element_wanted = key_found.getnext()
会是
element_wanted = key_found[0].getnext()
前提是您还测试列表是否包含元素
背景:
我知道有人问过这个问题,但我真的很难找到正确的 Xpath 公式。我正在使用 iTunes XML 文件。所以 Apple 真的很烦他们如何格式化这个文件......他们没有制作标签,然后文本是 ID,他们只使用 , ,
我一直在尝试关注这个问题:Python ElementTree: find element by its child's text using XPath but it's just not working for me. I've been reading this (https://lxml.de/tutorial.html) 文档,但我没有找到我需要的答案。我相当确定 Xpath 是正确的选择,但我会采纳任何更好的建议。
我确实尝试过使用一些 iTunes 特定的库。看起来它们都已经过时了,或者只是没有按照我的需要工作。我最初使用的是 Elementtree,但是当 Apple 以这种方式格式化文件时,lxml 的 getnext() 功能是一个救星。
示例 XML 文件:
<plist version="1.0">
<dict>
<key>Library Persistent ID</key><string>6948B4402F0EEFFF</string>
<key>Tracks</key>
<dict>
<key>18051</key>
<dict>
<key>Track ID</key><integer>18051</integer>
<key>Size</key><integer>7930116</integer>
<key>Total Time</key><integer>196336</integer>
<key>BPM</key><integer>86</integer>
<key>Date Modified</key><date>2018-10-23T12:41:05Z</date>
<key>Date Added</key><date>2017-07-25T02:49:11Z</date>
</dict>
<key>18053</key>
<dict>
<key>Track ID</key><integer>18053</integer>
<key>Size</key><integer>9780560</integer>
<key>Total Time</key><integer>243513</integer>
<key>Year</key><integer>2010</integer>
<key>BPM</key><integer>74</integer>
<key>Date Modified</key><date>2018-10-23T12:41:09Z</date>
<key>Date Added</key><date>2017-07-25T02:49:11Z</date>
</dict>
<key>18055</key>
<dict>
<key>Track ID</key><integer>18055</integer>
<key>Size</key><integer>12995663</integer>
<key>Total Time</key><integer>323604</integer>
<key>Year</key><integer>2005</integer>
<key>BPM</key><integer>76</integer>
<key>Date Modified</key><date>2018-10-23T12:41:14Z</date>
<key>Date Added</key><date>2017-07-25T02:49:11Z</date>
</dict>
方法: 因此,假设我需要找到 ID 为“18053”的元素,而不是递归地遍历所有内容(我已经想出了如何做),如果我可以检查 ID #,效率会高得多。然后获取
之后的元素我试过以下方法:
root = etree.parse(xml_file_path)
key_found = root.xpath("//key[text()='18053']")
element_wanted = key_found.getnext()
但是得到一个错误,因为 key_found 是一个列表,而不是一个元素。
使用查找,应该 return 一个元素,但使用以下内容:
key_found = root.find("//key[text()='18053']")
我收到错误“谓词错误”
感谢任何帮助。几天来我一直在研究这个。怪苹果! 谢谢!
xpath方法应该return一个列表,所以
element_wanted = key_found.getnext()
会是
element_wanted = key_found[0].getnext()
前提是您还测试列表是否包含元素