You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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("未找到任何最近访问的文件")

代码关键点解释

  1. 命名空间处理:通过namespaces字典映射前缀和对应的URL,在find/findall方法中指定该参数,并用bookmark:applications这种带前缀的标签名查找元素。
  2. 时间转换:XML中的时间格式是YYYY-MM-DDTHH:MM:SSZ,需要把末尾的Z替换为+00:00才能被datetime.fromisoformat正确解析为UTC时间。
  3. 最新文件筛选:提取每个书签的visited和modified时间,取两者中较新的作为文件的最后操作时间,然后对所有文件按时间倒序排序,第一个结果就是目标文件。

内容的提问来源于stack exchange,提问作者Silve2611

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:52:37