如何在Python中通过标签查找XML元素并获取recently-used.xbel中最近访问的文件
如何解析recently-used.xbel并获取最近访问的文件
你遇到的问题核心是XML命名空间的处理——bookmark:applications元素属于http://www.freedesktop.org/standards/desktop-bookmarks命名空间,直接用普通标签名查找肯定找不到。另外,要找到最近访问的文件,我们需要提取每个书签的时间属性并做比较。下面是完整的解决方案:
关键问题说明
你的代码里bookmark.find('applications')失败,是因为这个元素带有bookmark:前缀,对应XML里定义的命名空间:
xmlns:bookmark="http://www.freedesktop.org/standards/desktop-bookmarks"
Python的xml.etree.ElementTree默认不会自动识别命名空间,必须显式指定命名空间映射才能正确查找这类元素。
完整解决方案代码
from pathlib import Path import xml.etree.ElementTree as ET from datetime import datetime # 获取recently-used.xbel的路径 home = str(Path.home()) xbel_path = f"{home}/.local/share/recently-used.xbel" # 定义XML中用到的命名空间映射 namespaces = { 'bookmark': 'http://www.freedesktop.org/standards/desktop-bookmarks', 'mime': 'http://www.freedesktop.org/standards/shared-mime-info' } # 解析XML文件 tree = ET.parse(xbel_path) root = tree.getroot() # 存储每个文件的(最新操作时间, 文件路径)元组 recent_files = [] for bookmark in root.iter('bookmark'): # 提取文件路径,去掉file://前缀 file_path = bookmark.get('href').replace('file://', '') # 提取visited和modified时间字符串,转换为datetime对象 visited_str = bookmark.get('visited') modified_str = bookmark.get('modified') # 处理时间格式:将Z替换为+00:00,适配datetime.fromisoformat visited_time = datetime.fromisoformat(visited_str.replace('Z', '+00:00')) if visited_str else None modified_time = datetime.fromisoformat(modified_str.replace('Z', '+00:00')) if modified_str else None # 取两个时间中较新的那个作为文件的最后操作时间 latest_time = max(filter(None, [visited_time, modified_time])) # 如果你需要访问bookmark:applications下的应用信息,用这段代码 apps_section = bookmark.find('.//bookmark:applications', namespaces) if apps_section: for app in apps_section.findall('bookmark:application', namespaces): app_name = app.get('name') app_last_used = app.get('modified') # 这里可以根据需求处理应用信息,比如打印 # print(f"关联应用: {app_name}, 最后使用时间: {app_last_used}") # 将文件信息加入列表 recent_files.append((latest_time, file_path)) # 按时间倒序排序,取第一个就是最新访问/修改的文件 recent_files.sort(reverse=True) if recent_files: latest_time, latest_file = recent_files[0] print(f"最近操作的文件: {latest_file}") print(f"最后操作时间: {latest_time.strftime('%Y-%m-%d %H:%M:%S')}") else: print("未找到任何最近访问的文件")
代码关键点解释
- 命名空间处理:通过
namespaces字典映射前缀和对应的URL,在find/findall方法中指定该参数,并用bookmark:applications这种带前缀的标签名查找元素。 - 时间转换:XML中的时间格式是
YYYY-MM-DDTHH:MM:SSZ,需要把末尾的Z替换为+00:00才能被datetime.fromisoformat正确解析为UTC时间。 - 最新文件筛选:提取每个书签的
visited和modified时间,取两者中较新的作为文件的最后操作时间,然后对所有文件按时间倒序排序,第一个结果就是目标文件。
内容的提问来源于stack exchange,提问作者Silve2611
相关产品推荐
相关产品推荐

