blackantt 发表于 2025-11-25 15:24:56

求助,怎么把英语课本中的分栏按单元词汇导出来?

本帖最后由 blackantt 于 2025-11-25 15:30 编辑

想把pdf里的词汇按照 Vocabulary in Each Unit/Vocabulary from Primary School, Starter Unit/Unit的分类整理出来, 形成表格。用了 PyMuPDF, pdfplumber 等,遇到例外,总是从左边跳到了右边,最后都是乱的。

, 这个是pdf文件


下面是pdf的几个关键内容页








想最终形成以下这种格式

FishC 发表于 2025-11-25 15:33:18

您好!理解您的问题:从分栏PDF中提取词汇时,文本顺序混乱,是因为工具默认按阅读顺序提取,但分栏内容可能从左栏跳到右栏,导致提取结果不连贯。下面我将提供一个使用Python和pdfplumber的解决方案,通过定义分栏区域来分别提取文本,然后整理成表格格式。

### 步骤概述:
1. 使用pdfplumber打开PDF,并分析页面布局(例如,通过页面宽度定义左栏和右栏)。
2. 分别提取左栏和右栏的文本。
3. 使用正则表达式识别分类标题(如"Vocabulary in Each Unit")和对应的词汇。
4. 将数据保存为CSV表格。

### 代码示例:
以下代码是一个基本示例,您可能需要根据实际PDF调整分栏边界和正则表达式。


import pdfplumber
import re
import csv

# 替换为您的PDF文件路径
pdf_path = "english_book.pdf"
output_csv = "vocabulary.csv"

# 打开PDF文件
with pdfplumber.open(pdf_path) as pdf:
    all_text = ""
    for page in pdf.pages:
      # 获取页面尺寸
      width = page.width
      height = page.height
      
      # 定义左栏和右栏的边界(这里假设分栏在页面中间,您可能需要调整)
      left_bbox = (0, 0, width/2, height)# 左栏区域:从左上角到中间
      right_bbox = (width/2, 0, width, height)# 右栏区域:从中间到右下角
      
      # 提取左栏文本
      left_text = page.within_bbox(left_bbox).extract_text()
      # 提取右栏文本
      right_text = page.within_bbox(right_bbox).extract_text()
      
      # 合并文本(先左栏后右栏)
      page_text = left_text + "\n" + right_text
      all_text += page_text + "\n"

# 使用正则表达式匹配分类和词汇
# 假设分类标题如 "Vocabulary in Each Unit",后跟词汇列表(直到下一个标题或结尾)
pattern = r'(Vocabulary in Each Unit|Vocabulary from Primary School|Starter Unit|Unit \d+)(.*?)(?=Vocabulary in Each Unit|Vocabulary from Primary School|Starter Unit|Unit \d+|$)'
matches = re.findall(pattern, all_text, re.DOTALL)

# 准备表格数据
data = []
for match in matches:
    category = match.strip()
    vocabulary_text = match.strip()
    # 分割词汇文本为行(假设每行一个词汇)
    words = vocabulary_text.split('\n')
    for word in words:
      word = word.strip()
      if word:# 忽略空行
            data.append()

# 保存为CSV文件
with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Category', 'Vocabulary'])# 表头
    writer.writerows(data)

print("提取完成!数据已保存到", output_csv)


### 注意事项:
- 分栏边界调整:如果PDF的分栏不是均匀的,您可能需要手动检查页面宽度,并调整 left_bbox 和 right_bbox 的坐标。例如,使用 page.width/2 可能不准确,可以尝试用具体像素值。
- 正则表达式优化:如果分类标题或词汇格式不同(例如有编号、项目符号),您需要修改 pattern 来匹配实际内容。
- 测试建议:先在小范围页面测试代码,确保提取正确。
- 其他工具:如果pdfplumber不适用,可以尝试PyMuPDF的类似功能,但pdfplumber通常更易于处理文本位置。

这个方案应该能帮助您整理出表格格式。如果仍有问题,请提供更多PDF细节(如截图或示例文本),我可以进一步优化代码!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 2025-11-25 18:46:49

同问,这个有点难

smallwh 发表于 2025-11-28 17:26:09

本帖最后由 smallwh 于 2025-11-28 17:29 编辑

我负责将难度等级降低一个数量级:
(文本文件)
超出一行的单词释义在文件中占两行,需要进一步处理。
以下是部分效果:
Vocabulary in Each Unit

Starter Unit 1
unit /ˈjuːnɪt/ n. 单元 p.1
starter /ˈstɑːtə(r)/ unit 过渡单元 p.1
section /ˈsekʃn/ n. 部分;地区 p.1
greet /ɡriːt/ v. 招呼;问候 p.1
each /iːtʃ/ adj. & pron.每个;各自 p.2
other /ˈʌeə(r)/ pron. 另外的人(或物)
adj. 另外的;其他的 p.2
each other 互相;彼此 p.2
oh /əʊ/ interj. 哦;啊 p.2
everyone /ˈevriwʌn/
pron. 每人;所有人 p.2
start /stɑːt/ v. 开始;着手 p.4
conversation /ˌkɒnvəˈseɪʃn/
n. 谈话;交谈 p.4
spell /spel/ v. 用字母拼;拼写 p.4
bell /bel/ n. 铃(声);钟(声) p.4
Helen /ˈhelən/ 海伦 p.1
Ella /ˈelə/ 埃拉 p.1
Emma /ˈemə/ 埃玛 p.1
Peter /ˈpiːtə(r)/ 彼得 p.1
Brown /braʊn/ 布朗 p.2
PRC /ˌpiː ɑː(r) ˈsiː/ 中华人民共和国 p.3
PLA /ˌpiː el ˈeɪ/ 中国人民解放军 p.3
VR /ˌviː ˈɑː(r)/ 虚拟现实 p.3
WHO /ˌdʌbljuː eɪtʃ ˈəʊ/ 世界卫生组织 p.3
UN /ˌjuː ˈen/ 联合国 p.3
Miller /ˈmɪlə(r)/ 米勒 p.4
                         其实实现非常简单,只需要用 Chrome 打开 PDF ,Ctrl+A,Ctrl+C,Ctrl+V 到记事本里,手动删除一些标头和页脚并换行

smallwh 发表于 2025-11-28 17:28:02

smallwh 发表于 2025-11-28 17:26
我负责将难度等级降低一个数量级:

超出一行的单词释义在文件中占两行,需要进一步处理。


额,粘贴到论坛上的音标全乱码了
文件里是正常的
页: [1]
查看完整版本: 求助,怎么把英语课本中的分栏按单元词汇导出来?