在python中解析非结构化文本

时间:2020-08-20 13:20:53

标签: python parsing pdf text

是python的新手,正在尝试读取PDF文件以提取ID No.。到目前为止,我已经成功使用pdfplumber从PDF文件中提取了文本。下面是代码块:

import pdfplumber

with pdfplumber.open('ABC.pdf') as pdf_file:
    firstpage = pdf_file.pages[0]
    raw_text = firstpage.extract_text()
    print (raw_text)

以下是文本输出:

Welcome to ABC
01 January, 1991
ID No. : 10101010
Welcome to your ABC portal. Learn
More text here..
Even more text here..
Mr Jane Doe
Jack & Jill Street Learn more about your
www.abc.com
....
....
....

但是,无法找到进一步解析此非结构化文本的最佳方法。期望最终输出仅为ID号,即10101010。顺便提一句,该脚本将用于相当大量的PDF,因此性能值得关注。

3 个答案:

答案 0 :(得分:4)

尝试使用正则表达式:

import pdfplumber
import re

with pdfplumber.open('ABC.pdf') as pdf_file:
    firstpage = pdf_file.pages[0]
    raw_text = firstpage.extract_text()
    m = re.search(r'ID No\. : (\d+)', raw_text)
    if m:
        print(m.group(1))

当然,您必须遍历所有 PDF的内容-而不仅仅是首页!也要问问自己,每页是否可能有多个匹配项。无论如何:您比我更了解输入的结构(并且我们无权访问示例文件),所以我将其作为练习留给您。

答案 1 :(得分:0)

如果ID号的长度始终相同,我将尝试使用find-function查找它的位置。 position = raw_text.find('ID No. : ')应该返回ID号中I的位置。position + 9应该是ID的第一位。当数字的长度始终为8时,您可以使用int(raw_text[position+9:position+17]

答案 2 :(得分:0)

如果您是Python的新手,并且实际上需要处理大量数据,建议您将Scala作为替代方法。

对于一般的数据处理,尤其是对正则表达式匹配而言,获得结果所需的时间大大减少。

以下是您在Scala中而不是Python的问题的答案:

import com.itextpdf.text.pdf.PdfReader
import com.itextpdf.text.pdf.parser.PdfTextExtractor

val fil = "ABC.pdf"

val textFromPage = (1 until (new PdfReader(fil)).getNumberOfPages).par.map(page => PdfTextExtractor.getTextFromPage(new PdfReader(fil), page)).mkString

val r = "ID No\\. : (\\d+)".r

val res = for (m <- r.findAllMatchIn(textFromPage )) yield m.group(0)

res.foreach(println)