您现在的位置是:首页 > 技术教程 正文

运用Python抓取PDF表格中的特定数据并生成Excel文件

admin 阅读: 2024-03-20
后台-插件-广告管理-内容页头部广告(手机)

在工作中遇到了一个问题,需要把PDF中的地方债数据粘贴到Excel表格中,在PDF的每个表格中需要找到“金额”“本息和”“项目总收益”“项目名称”“项目类型”……等等数据。每一页表格需要复制粘贴十次,一共四百多页的PDF岂不是要复制粘贴八千次!眼瞎了都粘不完吧!于是我开始尝试用Python来读取PDF表格,然后找到每个表格对应位置的数据,对应到新生成的序列中,最后导出为Excel。

如图一,这是PDF中每一页记录的地方债项目数据。

 我需要的Excel表格如下图所示:

接下来就是代码展示:

处理单页PDF的代码 

首先运用pdfplumber,如果没有安装需要先安装:

pip install pdfplumber

安装后就可以开始使用了:

  1. import pdfplumber
  2. #导入使用的库
  3. # 读取pdf文件,使用的时候改成自己的路径就行
  4. pdf = pdfplumber.open('D://test1.pdf')
  5. # 访问第一页(使用时改成自己需要的页码即可,页码-1等于[]中需要填的数字
  6. first_page = pdf.pages[0]
  7. # 自动读取表格信息,返回列表
  8. table = first_page.extract_table()
  9. print(table)

我读取了对应页码的数据,输出结果如下:

这些数据看起来乱七八糟的,我需要把其中的“None”给去掉:

 

  1. table = [[cell for cell in row if cell is not None and cell != ''] for row in table]
  2. #table中乱七八糟的none就被去掉了
  3. #接下来将列表转化为dataframe的结构,然后就可以进行进一步操作了
  4. import pandas as pd
  5. # 将列表转化为dataframe
  6. table_data = pd.DataFrame(table)
  7. table_data

 这是输出的结果,我们可以看到,已经出现了表格的形状,接着我们就可以精准定位我们想要的数据所在的位置了,例如第一行第二列的那个数据,就可以表示为table[0][1]

接下来的代码如下:

  1. #生成一个新的表格序列,用来存储我们抓取到的数据
  2. df = pd.DataFrame(columns=["城市", "项目名称", "项目类型(一级)", "项目类型(二级)", "金额(本金)", "期限", "计划总投资", "项目总收益", "本息和", "信用评级结果", "还本方式"])
  3. #变量名称和后面的坐标位置根据实际情况来进行调整
  4. city = ","
  5. project_name = table[0][1]
  6. project_type_1 = table[1][1]
  7. project_type_2 = table[2][1]
  8. amount = table[3][1]
  9. duration = table[5][1]
  10. planned_investment = table[9][1]
  11. total_return = table[17][1]
  12. principal_interest = table[28][1]
  13. credit_rating = "AAA"
  14. repayment_method = "分期还本"
  15. #将抓取到的数据对应到表格序列中
  16. df = df.append({
  17. "城市": city,
  18. "项目名称": project_name,
  19. "项目类型(一级)": project_type_1,
  20. "项目类型(二级)": project_type_2,
  21. "金额(本金)": amount,
  22. "期限": duration,
  23. "计划总投资": planned_investment,
  24. "项目总收益": total_return,
  25. "本息和": principal_interest,
  26. "信用评级结果": credit_rating,
  27. "还本方式": repayment_method
  28. }, ignore_index=True)
  29. #最后输出excel表格即可。路径根据自己实际需要修改
  30. output_file = "D:\\test1.xlsx"
  31. df.to_excel(output_file, index=False)

遍历每一页的工作代码:

上面只是单页的代码,你可以根据单页的情况来确定定位表格位置的数据,接下来展示遍历每一页的代码:

  1. import pdfplumber
  2. import pandas as pd
  3. pdf = pdfplumber.open('D://test1.pdf')
  4. df = pd.DataFrame(columns=["城市", "项目名称", "项目类型(一级)", "项目类型(二级)", "金额(本金)", "期限", "计划总投资", "项目总收益", "本息和", "信用评级结果", "还本方式"])
  5. #遍历每一页
  6. for page in pdf.pages:
  7. table = page.extract_table()
  8. if table is not None:
  9. table = [[cell for cell in row if cell is not None and cell != ''] for row in table]
  10. print(f"Page {page.page_number}:")
  11. for row in table:
  12. print(row)
  13. #此处要注意,我处理的pdf中,有些页面的表格是不对的,所以我确定了表格大于30行时才是我需要的表格,这里30这个数据根据实际情况调整,一般情况改为0也可以。
  14. if len(table) >= 30 :
  15. project_name = table[0][1]
  16. project_type_1 = table[1][1]
  17. #此处注意,我的pdf表格中,有些表格的项目类型二是空的,直接运行会报错,或者会忽略掉整条数据,因此这条代码的含义是,空着的就显示空就行。
  18. try:
  19. project_type_2 = table[2][1]
  20. except IndexError:
  21. project_type_2 = None
  22. #其他变量如果有空的情况也可以用上面的这种格式来处理
  23. amount = table[3][1]
  24. duration = table[8][1]
  25. planned_investment = table[9][1]
  26. total_return = table[17][1]
  27. principal_interest = table[28][1]
  28. credit_rating = "AAA"
  29. repayment_method = "分期还本"
  30. df = df.append({
  31. "城市": "",
  32. "项目名称": project_name,
  33. "项目类型(一级)": project_type_1,
  34. "项目类型(二级)": project_type_2,
  35. "金额(本金)": amount,
  36. "期限": duration,
  37. "计划总投资": planned_investment,
  38. "项目总收益": total_return,
  39. "本息和": principal_interest,
  40. "信用评级结果": credit_rating,
  41. "还本方式": repayment_method
  42. }, ignore_index=True)
  43. output_file = "D:\\test1.xlsx"
  44. df.to_excel(output_file, index=False)

这样运行过后,上百页的pdf,原本要把眼睛都复制粘贴瞎的excel表格就生成出来了!

工作效率大大提升!

另外大家在代码使用过程中有什么问题也可以问chatgpt,根据实际情况去调试~

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索