目标:如果pdf行包含子字符串,则复制整个句子(跨多行(。
我可以print()
line
phrase
出现在中
现在,一旦我找到这个line
,我想回到迭代,直到我从上一个句子中找到一个句子终止符:. ! ?
,然后再次向前迭代,直到下一个句子结束符。
这是因为我可以print()
该短语所属的整个句子。
Jupyter笔记本:
# pip install PyPDF2
# pip install pdfplumber
# ---
# import re
import glob
import PyPDF2
import pdfplumber
# ---
phrase = "Responsible Care Company"
# SENTENCE_REGEX = re.pattern('^[A-Z][^?!.]*[?.!]$')
def scrape_sentence(sentence, lines, index):
if '.' in lines[index] or '!' in lines[index] or '?' in lines[index]:
return sentence.replace('n', '').strip()
sentence = scrape_sentence(lines[index-1] + sentence, lines, index-1) # previous line
sentence = scrape_sentence(sentence + lines[index+1], lines, index+1) #
following line
return sentence
# ---
with pdfplumber.open('../data/gri/reports/GPIC_Sustainability_Report_2020__-_40_Years_of_Sustainable_Success.pdf') as opened_pdf:
for page in opened_pdf.pages:
text = page.extract_text()
lines = text.split('n')
i = 0
sentence = ''
while i < len(lines):
if 'and Knowledge of Individuals; Behaviours; Attitudes, Perception ' in lines[i]:
sentence = scrape_sentence('', lines, i) # !
print(sentence) # !
i += 1
输出:
connection and the linkage to the relevant UN’s 17 SDGs.and Leadership. We have long realized and recognized that there
短语:
Responsible Care Company
句子(跨多行(:
"GPIC is a Responsible Care Company certified for RC 14001
since July 2010."
PDF(第2页(。
我一直在做"反向跟踪">迭代,基于此解决方案。我确实尝试过for-loop
,但它不会让您倒退迭代。
Regex语句添加
如果还有其他内容我可以添加到帖子中,请告诉我。
您得到的错误是由您的代码试图修改None类型的对象引起的。
要解决这个问题,有两种选择,第一种是在if语句中包围拆分操作
for page in opened_pdf.pages:
text = page.extract_text()
if text != None:
lines = text.split('n')
i = 0
sentence = ''
while i < len(lines):
if 'and Knowledge of Individuals; Behaviours; Attitudes, Perception ' in lines[i]:
sentence = scrape_sentence('', lines, i)
print(sentence)
i += 1
或者,您可以使用continue语句跳过循环的其余部分:
for page in opened_pdf.pages:
text = page.extract_text()
if text == None:
continue
lines = text.split('n')
i = 0
sentence = ''
while i < len(lines):
if 'and Knowledge of Individuals; Behaviours; Attitudes, Perception ' in lines[i]:
sentence = scrape_sentence('', lines, i) # !
print(sentence) # !
i += 1
我有一个工作版本。但是,这并不能考虑.pdf
页面中的多列文本。
请参阅此处了解与此相关的讨论。
示例.pdf
Jupyter笔记本:
# pip install PyPDF2
# pip install pdfplumber
# ---
import glob
import PyPDF2
import pdfplumber
# ---
def scrape_sentence(phrase, lines, index):
# -- Gather sentence 'phrase' occurs in --
sentence = lines[index]
print("-- sentence --", sentence)
print("len(lines)", len(lines))
# Previous lines
pre_i, flag = index, 0
while flag == 0:
pre_i -= 1
if pre_i <= 0:
break
sentence = lines[pre_i] + sentence
if '.' in lines[pre_i] or '!' in lines[pre_i] or '?' in lines[pre_i] or ' • ' in lines[pre_i]:
flag == 1
print("n", sentence)
# Following lines
post_i, flag = index, 0
while flag == 0:
post_i += 1
if post_i >= len(lines):
break
sentence = sentence + lines[post_i]
if '.' in lines[post_i] or '!' in lines[post_i] or '?' in lines[post_i] or ' • ' in lines[pre_i]:
flag == 1
print("n", sentence)
# -- Extract --
sentence = sentence.replace('!', '.')
sentence = sentence.replace('?', '.')
sentence = sentence.split('.')
sentence = [s for s in sentence if phrase in s]
print(sentence)
sentence = sentence[0].replace('n', '').strip() # first occurance
print(sentence)
return sentence
# ---
phrase = 'Global Reporting Initiative'
with pdfplumber.open('GPIC_Sustainability_Report_2016-v9_(lr).pdf') as opened_pdf:
for page in opened_pdf.pages:
text = page.extract_text()
if text == None:
continue
lines = text.split('n')
i = 0
sentence = ''
while i < len(lines):
if phrase in lines[i]:
sentence = scrape_sentence(phrase, lines, i)
i += 1
输出:
-- sentence -- 2016 Global Reporting Initiative (GRI) Report
len(lines) 7
2016 Global Reporting Initiative (GRI) Report
2016 Global Reporting Initiative (GRI) ReportIncluding: UN Global Compact - Communication on ProgressUN Global Compact - Food and Agriculture Business PrinciplesUN Global Compact - Women’s Empowerment Principlesgulf petrochemical industries companyii GPIC SuStaInabIlIty RePoRt 2016 GPIC SuStaInabIlIty RePoRt 2016 01
['2016 Global Reporting Initiative (GRI) ReportIncluding: UN Global Compact - Communication on ProgressUN Global Compact - Food and Agriculture Business PrinciplesUN Global Compact - Women’s Empowerment Principlesgulf petrochemical industries companyii GPIC SuStaInabIlIty RePoRt 2016 GPIC SuStaInabIlIty RePoRt 2016 01']
2016 Global Reporting Initiative (GRI) ReportIncluding: UN Global Compact - Communication on ProgressUN Global Compact - Food and Agriculture Business PrinciplesUN Global Compact - Women’s Empowerment Principlesgulf petrochemical industries companyii GPIC SuStaInabIlIty RePoRt 2016 GPIC SuStaInabIlIty RePoRt 2016 01
...