Commençons par une idée. Disons que vous, en tant que véritable auditeur, souhaitez procéder à un examen des rapports de l'éleveur de chiens, en utilisant, entre autres, des ressources tierces. Pour ce faire, vous essayez d'obtenir des informations systématisées sur les chiots de l'éleveur, ne connaissant, par exemple, que le nom de leurs races, et composez un tableau à partir de celui-ci en Pandas, adapté à un traitement ultérieur de toute nature (toutes sortes de recherches statistiques, agrégations, etc.). Mais vos données sont stockées profondément dans un site Web abstrait, d'où vous ne pouvez les retirer que sous la forme d'une archive, où des documents de plusieurs formats sont empilés, à l'intérieur desquels se trouvent du texte, des images, des tableaux. Et s'il existe de nombreuses races de chiots et que pour chacune d'elles il y a une douzaine de fichiers pdf avec des tableaux, d'où n'avez-vous pas besoin de toutes les informations, et aussi, par exemple, avez-vous besoin des noms de ces tableaux ou notes de bas de page? Ajoutons plusieurs fonctions à notre projet,résoudre les tâches suivantes: déchargement et décompression de l'archive avec les données, recherche et traitement des fichiers pdf de l'archive, analyse des données reçues.
Tout d'abord, importons tout ce dont nous avons besoin. Divisons les bibliothèques dont nous avons besoin en bibliothèques système:
import os
import re
import glob
import csv
import shutil
et externes qui nécessitent une installation (pip install, comme je l'ai dit):
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
Maintenant, pour chacun de vos chiots, nous allons télécharger une grande archive avec des données, faisant référence au site par le nom de sa race:
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)
Nous avons maintenant une archive sur notre bureau. Décompressons-le, pour cela il suffit de connaître le chemin d'accès au fichier avec l'archive:
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)
Dans cette étape, nous obtiendrons un dossier avec des documents, où peuvent être pdf, csv, xls, png et d'autres choses intéressantes. Disons que nous voulons traiter plusieurs fichiers pdf contenant des tableaux avec des données. Mais comment les sortir de là? Tout d'abord, sélectionnons les documents du format requis dans le dossier:
all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')
Excellent. Nous avons maintenant un tas de fichiers avec du texte et des tableaux à l'intérieur. Lorsque vous essayez d'extraire des informations à partir de là, il se peut que les outils reconnaissent un tel mélange de manière très tordue, surtout si les tableaux sont collés les uns aux autres et que leurs titres ou notes de bas de page sont du texte séparé. Tabula vient à la rescousse! Mais d'abord, sortons de la première page de chaque document une petite description textuelle qui n'est pas incluse dans le tableau (un tel texte pour une tabula peut être un problème). Puisque la première page peut aussi avoir un tableau, utilisons focus:
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()
Commençons maintenant à travailler avec la table. Si vous avez de la chance et que le tableau de notre pdf est assez lisible, tabula le téléchargera correctement au format csv, vous n'aurez donc même pas besoin d'analyser les informations:
tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')
Voyez comment il peut maintenant être simple d'obtenir, par exemple, des données sur le personnage du chiot sélectionné:
data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']
Mais que se passe-t-il si l'auteur du texte collait des tableaux ensemble, ajoutait un nombre différent de colonnes aux lignes ou les mélangeait avec le texte? Ensuite, nous convertirons le fichier reçu de tabula dans un nouveau format:
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
Pour quoi? Cela vous permettra de rechercher rapidement et facilement les informations dont vous avez besoin à l'aide d'expressions régulières. Nous voulons trouver un ensemble de couleurs de race possibles:
def get_colors(data):
res = re.search('^: (.*)', data).group(1)
return res
Maintenant, nous avons accumulé une certaine quantité d'informations à partir de fichiers un par un chiot (par exemple, caractère, couleurs, poids). Ajoutons-le au dataframe pandas en tant que nouvelle ligne:
def append_new_row(dataframe, breed, temperament, colors, weight):
return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)
Ce que nous avons maintenant:
Nous avons donc déchargé une archive contenant des données du site, l'avons décompressée, avons sorti les documents dont nous avions besoin, obtenu des informations importantes de leur part et l'avons mise dans un format pratique. Désormais, ces données peuvent être comparées à celles fournies par l'entreprise, converties et analysées, et bien plus encore! Beaucoup plus pratique que de télécharger et d'écrire manuellement.
def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')
Il est important que vos actions restent totalement légales. Vous pouvez prendre des données sur des sites, vous ne pouvez pas voler de contenu. Vous pouvez télécharger automatiquement, vous ne pouvez pas mettre le serveur. Étudier les droits d'auteur et le Code pénal de la Fédération de Russie, ne causent pas de dommages.