解析与审核





让我们从一个想法开始。假设您是一名真正的审核员,希望使用第三方资源来检查养狗人的报告。为此,您尝试获取有关繁殖者幼犬的系统化信息,例如仅了解其品种的名称,然后在熊猫中根据其组成一张表格,以适合任何性质的进一步处理(各种统计研究,汇总等)。但是您的数据存储在某个抽象网站的深处,您只能从那里以存档的形式将其取出,在该存档中,多种格式的文档被堆叠在一起,其中包含文本,图片,表格。并且,如果有很多种幼犬,并且每种幼犬都有十几个带有表格的pdf文件,那么您在哪里不需要所有信息,例如,您是否需要这些表格或脚注的名称?让我们为我们的项目添加几个功能,解决以下任务:使用数据卸载和解压缩存档文件,从存档中搜索和处理pdf文件,分析接收到的数据。



首先,让我们导入您需要的所有内容。让我们将所需的库分为系统库:



import os
import re
import glob
import csv
import shutil


以及需要安装的外部设备(如我所说的pip install):



import requests as req
import pandas as pd
from zipfile import ZipFile
import tabula
import PyPDF2
from pdf2image import convert_from_path
from pytesseract import image_to_string
from PIL import Image, ImageDraw


现在,对于您的每只幼犬,我们将下载一个包含数据的大型存档,并以该犬种的名称来引用该站点:



def get_doquments_archive(breed):
            url = 'https://yourwebsite' + breed + '/document/download'
              with req.get(url, stream=True) as r:
                r.raise_for_status()
                with open('/Users/user/Desktop/' + breed + '.zip', 'wb') as f:
                         for chunk in r.iter_content(chunk_size=8192):
                                   f.write(chunk)


现在,我们在桌面上有了一个档案。让我们解压缩它,为此,我们只需要知道存档文件的路径即可:



def unzipper(zippath, cond = False):
 dirpath = zippath[:-4] + '_package'
 if os.path.exists(dirpath) and os.path.isdir(dirpath):
shutil.rmtree(dirpath)
os.mkdir(dirpath)
with ZipFile(zippath, 'r') as zipObj:
zipObj.extractall(path = dirpath)


在此步骤中,我们将获得一个包含文档的文件夹,其中可以包含pdf,csv,xls,png和其他漂亮的东西。假设我们要处理几个包含带有数据表的pdf文件。但是如何让他们离开那里呢?首先,让我们从文件夹中选择所需格式的文档:



all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')


优秀的。现在,我们有一堆文件,其中包含文本和表格。当试图从那里提取信息时,可能会发现工具非常歪曲地识别这种混合,特别是如果表格相互粘合在一起,并且其标题或脚注是单独的文本。Tabula来营救!但是首先,让我们从每个文档的第一页中删除表格中未包含的一些文字说明(表格的此类文字可能会成为问题)。由于第一页也可以有一个表,因此让我们使用焦点:



def get_text_description(path):
pdfFileObj = open(path,'rb')
pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
pages = convert_from_path(declar, 0)
page = pages[0]
pname = '/Users/user/Desktop/text_description.png'
page.save(pname, 'JPEG')
text = image_to_string(Image.open('/Users/user/Desktop/text_description.png'),
                                          lang = 'rus')
text_file = open('res', "w")
text_file.write(text)
text_file.close()


现在让我们开始使用表格。如果您很幸运,并且我们pdf中的表格可读性强,则tabula可以正确将其以csv格式上传,因此您甚至不必解析信息:



tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')


看看现在如何轻松获取例如所选小狗的性格方面的数据:



data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']


但是,如果文本的作者将表粘合在一起,在行中添加不同数量的列,或者将它们与文本混合在一起,该怎么办?然后,我们将从表格中接收到的文件转换为新格式:



def get_table_data(path):
 data = []
 with open(path) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
for val in row.values():
data.append(val)
data = str(data)
data = re.sub('\]|\[|,|\'', '', data)
data = data.replace("\\n", "")
return data


为了什么?这将使您可以使用正则表达式轻松快捷地搜索所需的信息。我们想找到一组可能的品种颜色:



def get_colors(data):
 res = re.search('^: (.*)', data).group(1)
 return res


现在,我们一次从一只小狗收集了一些文件信息(例如,字符,颜色,重量)。让我们将其作为新行添加到pandas数据框中:



def append_new_row(dataframe, breed, temperament, colors, weight):
  return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)


现在我们拥有的是:







因此,我们从站点中下载了存档数据,将其解压缩,取出所需的文档,从中提取重要信息并将其转换为方便的格式。现在,可以将这些数据与公司提供的数据进行比较,转换和分析,还有更多!比手动下载和写入方便得多。



def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')


您的行为必须完全合法,这一点很重要。您可以从站点获取数据,而不能窃取内容。您可以自动下载,不能放置服务器。研究版权和俄罗斯联邦刑法不会造成损害。



All Articles