Beginnen wir mit einer Idee. Angenommen, Sie möchten als echter Prüfer die Berichterstattung des Hundezüchters unter Verwendung von Ressourcen Dritter prüfen. Zu diesem Zweck versuchen Sie, systematisierte Informationen über die Welpen des Züchters zu erhalten, beispielsweise nur den Namen ihrer Rassen, und daraus eine Tabelle in Pandas zu erstellen, die für die weitere Verarbeitung jeglicher Art geeignet ist (alle Arten statistischer Forschung, Aggregation usw.). Ihre Daten werden jedoch tief in einer abstrakten Website gespeichert, von der aus Sie sie nur in Form eines Archivs herausnehmen können, in dem Dokumente verschiedener Formate gestapelt sind, in denen sich Text, Bilder und Tabellen befinden. Und wenn es viele Welpenrassen gibt und für jede von ihnen ein Dutzend PDF-Dateien mit Tabellen, woher brauchen Sie nicht alle Informationen und zum Beispiel auch die Namen dieser Tabellen oder Fußnoten? Fügen wir unserem Projekt mehrere Funktionen hinzu:Lösen der folgenden Aufgaben: Entladen und Entpacken des Archivs mit Daten, Suchen und Verarbeiten von PDF-Dateien aus dem Archiv, Analysieren der empfangenen Daten.
Importieren wir zunächst alles, was Sie benötigen. Teilen wir die benötigten Bibliotheken in Systembibliotheken auf:
import os
import re
import glob
import csv
import shutil
und externe, die installiert werden müssen (Pip-Installation, wie gesagt):
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
Jetzt laden wir für jeden Ihrer Welpen ein großes Archiv mit Daten herunter, das auf die Website mit dem Namen seiner Rasse verweist:
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)
Wir haben jetzt ein Archiv auf unserem Desktop. Packen wir es aus, dafür müssen wir nur den Pfad zur Datei mit dem Archiv kennen:
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)
In diesem Schritt erhalten wir einen Ordner mit Dokumenten, in dem PDF, CSV, XLS, PNG und andere nette Dinge sein können. Angenommen, wir möchten mehrere PDF-Dateien verarbeiten, die Tabellen mit Daten enthalten. Aber wie kann man sie da rausholen? Wählen Sie zunächst die Dokumente des gewünschten Formats aus dem Ordner aus:
all_pdfs = glob.glob(dirpath + '/*_pd*.pdf')
Ausgezeichnet. Wir haben jetzt eine Reihe von Dateien mit Text und Tabellen. Beim Versuch, Informationen von dort zu extrahieren, kann sich herausstellen, dass eine solche Mischung von den Werkzeugen sehr schief erkannt wird, insbesondere wenn die Tabellen miteinander verklebt sind und ihre Titel oder Fußnoten separater Text sind. Tabula kommt zur Rettung! Aber zuerst nehmen wir von der ersten Seite jedes Dokuments eine kleine Textbeschreibung heraus, die nicht in der Tabelle enthalten ist (ein solcher Text für eine Tabelle kann ein Problem sein). Da die erste Seite auch eine Tabelle enthalten kann, verwenden wir den Fokus:
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()
Beginnen wir nun mit der Arbeit mit dem Tisch. Wenn Sie Glück haben und die Tabelle in unserem PDF gut lesbar ist, lädt tabula sie korrekt im CSV-Format hoch, sodass Sie nicht einmal die Informationen analysieren müssen:
tabula.convert_into(file, 'output_file.csv', output_format = "csv", pages = 'all')
Sehen Sie, wie es jetzt einfach sein kann, beispielsweise Daten über den Charakter des ausgewählten Welpen abzurufen:
data = pd.read_csv('/Users/user/Desktop/output_file.csv')
temperament = data[data[''] == '']['']
Was aber, wenn der Autor des Textes Tabellen zusammengeklebt, den Zeilen eine andere Anzahl von Spalten hinzugefügt oder sie mit dem Text gemischt hat? Dann konvertieren wir die von tabula empfangene Datei in ein neues 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
Wofür? Auf diese Weise können Sie schnell und schmerzlos mit regulären Ausdrücken nach den benötigten Informationen suchen. Wir wollen eine Reihe möglicher Rassenfarben finden:
def get_colors(data):
res = re.search('^: (.*)', data).group(1)
return res
Jetzt haben wir eine bestimmte Menge an Informationen aus Dateien nacheinander gesammelt (z. B. Charakter, Farben, Gewicht). Fügen wir es dem Pandas-Datenrahmen als neue Zeile hinzu:
def append_new_row(dataframe, breed, temperament, colors, weight):
return dataframe.append({'': breed,
'': temperament,
'': colors,
'' : weight
}, ignore_index=True)
Was wir jetzt haben:
Also haben wir das Archiv mit den Daten von der Site entladen, entpackt, die benötigten Dokumente herausgenommen, wichtige Informationen daraus extrahiert und in ein praktisches Format gebracht. Jetzt können diese Daten mit denen des Unternehmens verglichen, konvertiert und analysiert werden und vieles mehr! Viel bequemer als das manuelle Herunterladen und Schreiben.
def clean_all(path):
os.remove(path + '.zip')
shutil.rmtree(path + '_package')
Es ist wichtig, dass Ihre Handlungen völlig legal bleiben. Sie können Daten von Websites übernehmen und keine Inhalte stehlen. Sie können automatisch herunterladen, Sie können den Server nicht setzen. Studienrechte und das Strafgesetzbuch der Russischen Föderation verursachen keinen Schaden.