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/