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/

相关推荐
在下不上天几秒前
Flume日志采集系统的部署,实现flume负载均衡,flume故障恢复
大数据·开发语言·python
SEVEN-YEARS4 分钟前
深入理解TensorFlow中的形状处理函数
人工智能·python·tensorflow
EterNity_TiMe_9 分钟前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
陌小呆^O^14 分钟前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp
Suyuoa20 分钟前
附录2-pytorch yolov5目标检测
python·深度学习·yolo
I_Am_Me_30 分钟前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
重生之我是数学王子40 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
Ai 编码助手42 分钟前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
学习前端的小z1 小时前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹1 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#