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. 设置环境

首先,确保已安装所需库 pandaslxml

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/

相关推荐
蓝莓味柯基26 分钟前
Python3:文件操作
python
投笔丶从戎30 分钟前
Kotlin Multiplatform--01:项目结构基础
android·开发语言·kotlin
xiaoh_71 小时前
解决视频处理中的 HEVC 解码错误:Could not find ref with POC xxx【已解决】
python·ffmpeg·音视频
杜小暑1 小时前
动态内存管理
c语言·开发语言·动态内存管理
想不明白的过度思考者1 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
明月与玄武2 小时前
Python编程的真谛:超越语法,理解编程本质
python·编程语言
我真的不会C2 小时前
QT窗口相关控件及其属性
开发语言·qt
CodeCraft Studio2 小时前
Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中进行数据验
开发语言·python·excel
火柴盒zhang2 小时前
websheet之 编辑器
开发语言·前端·javascript·编辑器·spreadsheet·websheet
景天科技苑2 小时前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配