python读取calibre的opf文件到表格

opf文件之一:

python 将 Calibre Library 里面所有opf文件的title,creator,date,description,language,subject内容写入表格中,其中opf之一如上,表头对应为:标题,作者,日期,描述,语言,标签。

1. 实现步骤

目录遍历 → xml 解析 → 信息提取 → 数据保存

使用 os.walk() 函数遍历指定的根目录及其所有子文件夹,返回每个目录路径、子文件夹的名称和文件名称列表, xml.etree.ElementTree 解析每个文件,通过定义的标签字典,提取标题、作者、日期、描述、语言和标签等字段,并在提取描述字段后的处理过程中使用正则表达式 re.sub() 方法来去除 标签字段 中的尖括号字符串(例如: <div>, <p>, <span style="...">, </p>等 HTML 标签),最后将提取的数据存入一个列表中,转换为 pandas 的 DataFrame,并保存为 .csv 文件。

2. 设置环境

首先,确保已安装所需库 pandas 和 lxml

bash 复制代码
pip install pandas lxml

3. 代码实现

python 复制代码
import os
import xml.etree.ElementTree as ET
import pandas as pd
import re

# 保存每个 OPF 文件的信息
data = [] 

# 定义要提取的信息的标签和对应的 CSV 列
tags = {
    'title': './/{http://purl.org/dc/elements/1.1/}title',
    'creator': './/{http://purl.org/dc/elements/1.1/}creator',
    'date': './/{http://purl.org/dc/elements/1.1/}date',
    'description': './/{http://purl.org/dc/elements/1.1/}description',
    'language': './/{http://purl.org/dc/elements/1.1/}language',
    'subject': './/{http://purl.org/dc/elements/1.1/}subject'
}


# 函数:删除描述中的 HTML 标签
def clean_html(raw_html):
    clean = re.sub(r'<.*?>', '', raw_html)  # 正则表达式去除标签
    return clean


# 指定包含子文件夹的根目录
root_directory = 'E:\Calibre Portable\Calibre Library'  # 替换为 OPF 文件的实际根目录

# 遍历目录中的所有子文件夹和 OPF 文件
for dirpath, _, filenames in os.walk(root_directory):
    for filename in filenames:
        if filename.endswith('.opf'):
            file_path = os.path.join(dirpath, filename)

            # 解析 OPF 文件
            try:
                tree = ET.parse(file_path)
                root = tree.getroot()

                # 提取信息
                extracted_data = {}
                for key, xpath in tags.items():
                    element = root.find(xpath)
                    if element is not None:
                        text = element.text if element.text is not None else ''
                        # 如果是描述字段,清理 HTML 标签
                        if key == 'description':
                            text = clean_html(text)
                        extracted_data[key] = text
                    else:
                        extracted_data[key] = ''

                # 将提取的数据添加到列表中
                data.append(extracted_data)

            except ET.ParseError as e:
                print(f'Error parsing {file_path}: {e}')
            except Exception as e:
                print(f'An error occurred with {file_path}: {e}')

# 创建 DataFrame 和保存到 CSV
df = pd.DataFrame(data)
df.columns = ['标题', '作者', '日期', '描述', '语言', '标签']  # 重命名列
output_file = 'output/output3.csv'  # 输出文件名
df.to_csv(output_file, index=False, encoding='utf-8-sig')

print(f'Data has been written to {output_file}.')

4. 运行效果


5. calibre 配置问题

a. 重名问题

calibre书title重名但实际不是同一本怎么办,(提前设置了查重)

解决方法:先把已存在的另改一个名字,然后导入,再把名字改回一样的就可以共存了。

b. 自动添加

配置添加书籍,指定目录

c. 批量修改

批量设置会更方便,例如:批量修改作者、标签、出版社等等。

d. 书籍合并

同一本书的不同格式同时存在于一个库,可以合并不同格式到第一本书。

如果不存在,导入时报提示,可以在元数据中导入:

f. 改变布局

e. 书籍备份


这里导出书名使用的好像是排序书名。

导出效果:

g. 网页访问

单击"连接/共享"按钮,然后选择"启动内容服务器"。

然后在电脑中打开浏览器(最好是Chrome或Firefox),输入以下地址:

复制代码
http://127.0.0.1:8080

这将在浏览器中打开一个页面,显示calibre书库,单击任意图书并浏览其中的书籍。单击一本书,它将显示有关该书的所有元数据,以及菜单按钮"阅读书籍"和"下载书籍"。单击菜单"阅读书籍"按钮开始阅读书籍。

参考:calibre-ebook中文手册 https://manual.calibre-ebook.com/zh_CN/

相关推荐
Mr. zhihao1 分钟前
Deep Agent 架构深度解析:主Agent与子Agent完整交互机制与核心参数作用
python·ai·langgraph·deepagent
后台模板学习6 分钟前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
狗凯之家源码网8 分钟前
iOS C2 V2 与 Python FastAPI 全链路远控系统深度评测
python·ios·fastapi
xiaoye-duck21 分钟前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(上):初始化和全量响应
开发语言·网络·c++·语言模型
fpcc26 分钟前
跟我学c++中级篇—streambuf在glog中的应用分析
开发语言·c++
吾与谁归in28 分钟前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
超级架构师30 分钟前
让 Fortran 模型自己调用 Agent:原生 Fortran 2008 实现深度剖析
人工智能·python·架构·机器人·开源·fortran
小蒜学长34 分钟前
基于Django+Vue喵汪联盟宠物领养系统的设计与实现(代码+数据库+LW)
后端·python·django·宠物领养系统·流程规范化
昂好的day39 分钟前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
飞浪纪元[FWC–FE]42 分钟前
Qt 构建排错实录:从 MSB 1009 到生成器选型
开发语言·数据库·qt