Zotero 是管理文献的利器,但默认报告往往包含大量无关信息。为提升效率,我借助 ChatGPT 编写了一段代码,只提取文献中的关键信息,如标题、作者和摘要,并导出为 Markdown 和 CSV 格式。

准备工作

  1. 在 Zotero 中选择想要导出的文献。
  2. 右键点击并选择“导出条目报告”功能。
  3. 使用 Command + S(Mac)或 Ctrl + S(Windows)保存 HTML 文件。
  4. 准备运行下面的代码。

完整代码

以下是完整的处理代码,包括从 HTML 文件中提取标题、作者、摘要、日期和期刊信息,去除摘要中的回车符,以及将提取的信息保存为 Markdown 和 CSV 文件的功能。请确保您已经安装了所需的库:beautifulsoup4pandas

1
2
3
pip install pandas

pip install beautifulsoup4

如果你在安装过程中遇到任何权限问题,可能需要在命令前加上sudo(对于macOS或Linux)或使用管理员模式打开命令行界面(对于Windows)。

这里只提取类别为 item journalArticle 的条目,如果要提取学位论文需要加上 item thesis

接下来就可以运行代码了,使用前请将 html 文件放在 py 文件一个路径下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 导入必要的库
from bs4 import BeautifulSoup # 用于解析HTML文件
import pandas as pd # 用于处理和保存数据

# 定义函数从HTML文件中提取信息
def extract_info_from_html(file_path):
# 打开并读取HTML文件
with open(file_path, 'r', encoding='utf-8') as file:
soup = BeautifulSoup(file, 'html.parser') # 创建BeautifulSoup对象解析HTML

# 初始化一个空列表存储所有文章的信息
articles_info = []
# - 通过`find_all`方法查找所有类为`item journalArticle`的`li`标签,每个`li`标签代表一篇文章。
# 论文类别为item thesis
articles = soup.find_all('li', class_='item journalArticle')

# 遍历每篇文章,提取所需信息
for article in articles:
title = article.find('h2').text.strip() # 提取标题
# 提取所有作者名称,每个作者在td标签中,且td标签之前有一个含有"class='author'"的th标签
authors = [td.text.strip() for td in article.find_all('td') if td.find_previous_sibling('th', class_='author')]
# 提取摘要信息,如果没有找到摘要,则返回"摘要信息未提供"
abstract = article.find('th', text='摘要').find_next_sibling('td').text.strip() if article.find('th', text='摘要') else "摘要信息未提供"
abstract = abstract.replace('\n', ' ') # 去除摘要中的回车符,保证文本连贯
# 提取日期信息,如果没有找到日期,则返回"日期信息未提供"
date = article.find('th', text='日期').find_next_sibling('td').text.strip() if article.find('th', text='日期') else "日期信息未提供"
# 提取期刊信息,如果没有找到期刊,则返回"期刊信息未提供"
journal = article.find('th', text='期刊').find_next_sibling('td').text.strip() if article.find('th', text='期刊') else "期刊信息未提供"

# 将提取的信息作为字典添加到列表中
articles_info.append({
'标题': title,
'作者': ', '.join(authors),
'摘要': abstract,
'日期': date,
'期刊': journal
})

return articles_info # 返回包含所有文章信息的列表

# 定义函数将提取的信息保存为Markdown文件
def save_to_markdown(articles_info, md_file_path):
markdown_content = "" # 初始化Markdown内容字符串
# 遍历每篇文章的信息,生成Markdown格式文本
for article in articles_info:
markdown_content += f"### 标题: {article['标题']}\n"
markdown_content += f"#### 作者: {article['作者']}\n"
markdown_content += f"#### 日期: {article['日期']}\n"
markdown_content += f"#### 期刊: {article['期刊']}\n"
markdown_content += f"#### 摘要: \n{article['摘要']}\n\n---\n\n"
# 将Markdown内容写入指定的文件
with open(md_file_path, 'w', encoding='utf-8') as md_file:
md_file.write(markdown_content)

# 定义函数将提取的信息保存为CSV文件
def save_to_csv(articles_info, csv_file_path):
# 将提取的信息转换为DataFrame
df_articles = pd.DataFrame(articles_info)
# 将DataFrame保存为CSV文件
df_articles.to_csv(csv_file_path, index=False, encoding='utf-8-sig')

# ----------------需要填写的信息--------------------
# 示例使用:指定文件路径(当前路径下)
file_path = 'Zotero_报告.html' # HTML文件路径
md_file_path = 'output.md' # Markdown文件保存路径
csv_file_path = 'output.csv' # CSV文件保存路径

# 执行提取和保存操作
articles_info = extract_info_from_html(file_path) # 提取信息
save_to_markdown(articles_info, md_file_path) # 保存为Markdown
save_to_csv(articles_info, csv_file_path) # 保存为CSV

print("提取和保存完成。") # 完成提示


验证

如果出现问题可以尝试运行以下验证

验证提取的第一条信息

1
2
3
4

file_path = 'path/to/your/Zotero_报告.html' # 替换为您的文件路径
articles_info = extract_info_from_html(file_path)
print(articles_info[:1]) # 打印第一篇文章的信息作为示例

验证总数

1
2
3
4

# 现在我们有了整个文件的所有文章信息,这里显示提取的文章数量作为确认
len(articles_info)

效果预览

Markdown 文件预览

图片描述

CSV 文件预览

图片描述

优化:排序

尝试了一下用 python 代码排序,但是对于格式不一致的日期处理有些麻烦。不如把下好的 csv 文件拿 excel 处理好再转为易读的 markdown 格式用于在 pad 或者手机上摸鱼(

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import pandas as pd

# 定义读取CSV文件和转换为Markdown的函数
def read_csv_and_convert_to_markdown(csv_file_path, markdown_file_path):
# 读取CSV文件
data = pd.read_csv(csv_file_path)

# 定义转换函数,按照特定格式来转换数据
def convert_to_markdown_custom_format(df):
markdown_content = ""
for index, row in df.iterrows():
markdown_content += f"### 标题: {row['标题']}\n"
markdown_content += f"#### 作者: {row['作者']}\n"
markdown_content += f"#### 日期: {row['日期']}\n"
markdown_content += f"#### 期刊: {row['期刊']}\n"
markdown_content += f"#### 摘要: \n{row['摘要']}\n\n---\n\n"
return markdown_content

# 使用定义的格式转换数据
markdown_content = convert_to_markdown_custom_format(data)

# 将Markdown内容保存到文件中
with open(markdown_file_path, 'w', encoding='utf-8') as file:
file.write(markdown_content)

print(f"Markdown file has been saved to {markdown_file_path}")

# 指定CSV文件路径和将要保存的Markdown文件路径
csv_file_path = 'Zotero_报告提取.csv' # 请替换为您的CSV文件路径
markdown_file_path = 'Zotero_Report_Extracted_Custom.md' # 请替换为您想要保存Markdown文件的路径

# 调用函数
read_csv_and_convert_to_markdown(csv_file_path, markdown_file_path)

print("转换和保存完成。") # 完成提示

working

©   开心地使用 Stellar 主题 ✧ 星际地球 读取运行时……

收集了 11 颗星星 ✧ 共 7.8w 颗星尘,

Umami Analytics Enabled | 站点更新日志