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/

相关推荐
万物得其道者成几秒前
React Zustand状态管理库的使用
开发语言·javascript·ecmascript
奈斯。zs4 分钟前
yjs08——矩阵、数组的运算
人工智能·python·线性代数·矩阵·numpy
Melody20504 分钟前
tensorflow-dataset 内网下载 指定目录
人工智能·python·tensorflow
学步_技术6 分钟前
Python编码系列—Python抽象工厂模式:构建复杂对象家族的蓝图
开发语言·python·抽象工厂模式
wn53129 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
Narutolxy39 分钟前
Python 单元测试:深入理解与实战应用20240919
python·单元测试·log4j
Hello-Mr.Wang41 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
救救孩子把44 分钟前
Java基础之IO流
java·开发语言
WG_171 小时前
C++多态
开发语言·c++·面试
宇卿.1 小时前
Java键盘输入语句
java·开发语言