使用Tika解析PDF后按指定起止标记提取区间表格数据的方法咨询
问题解决方法
报错原因说明
你调用next()报错是因为pdf_parser.split('\n')返回的是列表对象,不是迭代器,需要先调用iter()方法将列表转为迭代器才能使用next()。
推荐实现方案(状态标记法,逻辑简单易调试)
该方案通过开关标记判断当前是否处于需要提取的内容区间,无需操作迭代器,适配性更强:
# 初始化存储容器与状态标记 orders_table = [] transactions_table = [] in_orders = False in_transactions = False # 遍历所有行,先去除首尾空白避免匹配失败 for line in pdf_parser.split('\n'): stripped_line = line.strip() # 匹配Orders标题,开启提取标记 if stripped_line == 'Orders': in_orders = True continue # 匹配Orders终止行,关闭提取标记 if in_orders: if stripped_line.startswith('total orders'): in_orders = False continue # 非空行存入结果,可自行去掉该判断保留空行 if stripped_line: orders_table.append(line) # 匹配Transactions标题,开启提取标记 if stripped_line == 'Transactions': in_transactions = True continue # 匹配Transactions终止行,关闭提取标记 if in_transactions: if stripped_line == 'end - of - transaction': in_transactions = False continue if stripped_line: transactions_table.append(line) # 打印结果验证 print("Orders表格内容:", orders_table) print("Transactions表格内容:", transactions_table)
迭代器实现方案(适配你想用next()的场景)
如果你更习惯用迭代器写法,可以参考以下代码:
# 先将拆分后的列表转为迭代器 lines = iter(pdf_parser.split('\n')) orders_table = [] transactions_table = [] for line in lines: stripped_line = line.strip() # 提取Orders区间内容 if stripped_line == 'Orders': while True: current_line = next(lines) current_stripped = current_line.strip() if current_stripped.startswith('total orders'): break if current_stripped: orders_table.append(current_line) # 提取Transactions区间内容 if stripped_line == 'Transactions': while True: current_line = next(lines) current_stripped = current_line.strip() if current_stripped == 'end - of - transaction': break if current_stripped: transactions_table.append(current_line)
注意事项:如果PDF解析出来的标题前后可能带其他字符,可以将匹配条件调整为'Orders' in stripped_line或者用正则表达式匹配,提升容错性。
内容的提问来源于stack exchange,提问作者Herc01
相关产品推荐
相关产品推荐

