Zotero 是管理文献的利器,但默认报告往往包含大量无关信息。为提升效率,我借助 ChatGPT 编写了一段代码,只提取文献中的关键信息,如标题、作者和摘要,并导出为 Markdown 和 CSV 格式。
准备工作#
- 在 Zotero 中选择想要导出的文献。
- 右键点击并选择“导出条目报告”功能。
- 使用 Command + S(Mac)或 Ctrl + S(Windows)保存 HTML 文件。
- 准备运行下面的代码。
完整代码#
以下是完整的处理代码,包括从 HTML 文件中提取标题、作者、摘要、日期和期刊信息,去除摘要中的回车符,以及将提取的信息保存为 Markdown 和 CSV 文件的功能。请确保您已经安装了所需的库:beautifulsoup4
和 pandas
。
pip install pandas
pip install beautifulsoup4
如果你在安装过程中遇到任何权限问题,可能需要在命令前加上sudo
(对于macOS或Linux)或使用管理员模式打开命令行界面(对于Windows)。
这里只提取类别为 item journalArticle
的条目,如果要提取学位论文需要加上 item thesis
接下来就可以运行代码了,使用前请将 html 文件放在 py 文件一个路径下。
# 导入必要的库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) # 保存为Markdownsave_to_csv(articles_info, csv_file_path) # 保存为CSV
print("提取和保存完成。") # 完成提示
验证#
如果出现问题可以尝试运行以下验证
验证提取的第一条信息#
file_path = 'path/to/your/Zotero_报告.html' # 替换为您的文件路径articles_info = extract_info_from_html(file_path)print(articles_info[:1]) # 打印第一篇文章的信息作为示例
验证总数#
# 现在我们有了整个文件的所有文章信息,这里显示提取的文章数量作为确认len(articles_info)
效果预览#
Markdown 文件预览#

CSV 文件预览#

优化:排序#
尝试了一下用 python 代码排序,但是对于格式不一致的日期处理有些麻烦。不如把下好的 csv 文件拿 excel 处理好再转为易读的 markdown 格式用于在 pad 或者手机上摸鱼(
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("转换和保存完成。") # 完成提示
> cd ..