scraping - read pdf python
Trabajando en tablas en pdf usando python (4)
Estoy trabajando en un archivo pdf. Hay varias tablas en ese pdf.
De acuerdo con los nombres de tabla dados en el pdf, quería buscar los datos de esa tabla usando Python.
He trabajado en html, xlm pero nunca con pdf.
¿Alguien puede decirme cómo buscar tablas desde el pdf usando Python?
Creo que necesitas una biblioteca de analizador de Python. El más famoso es PDFMiner .
De acuerdo con la documentación:
PDFMiner es una herramienta para extraer información de documentos PDF. A diferencia de otras herramientas relacionadas con PDF, se centra completamente en obtener y analizar datos de texto. PDFMiner le permite a uno obtener la ubicación exacta del texto en una página, así como otra información como fuentes o líneas. Incluye un convertidor de PDF que puede transformar archivos PDF a otros formatos de texto (como HTML). Tiene un analizador de PDF extensible que puede usarse para otros fines además del análisis de texto.
Este es un problema muy complejo y no solucionable en general.
La razón de esto es simplemente que el formato PDF es demasiado flexible. Algunos archivos PDF son solo mapas de bits (entonces tendría que hacer su propio OCR, obviamente no es nuestro tema aquí), algunos son un montón de cartas literalmente distribuidas en las páginas; esto significa que al analizar la información de texto en el PDF, puede obtener caracteres individuales en algunas coordenadas. En algunos casos, estos vienen de forma ordenada (línea por línea, de izquierda a derecha), pero en algunos casos obtendrás distribuciones bastante aleatorias, más comúnmente con y cosas así, pero también caracteres especiales, caracteres en una fuente diferente, etc. . puede venir fuera de línea.
El único enfoque adecuado es ubicar a todos los personajes de acuerdo con sus coordenadas en un modelo de página y luego usar la heurística para descubrir cuáles son las líneas.
Propongo echar un vistazo a sus archivos PDF y las tablas que desea analizar antes de comenzar. Tal vez son iguales todo el tiempo y bien analizable.
¡Buena suerte!
Nota: Pero este está en Java
Este es útil para extraer datos de tablas dentro de PDF.
Recientemente tuve un problema similar y escribí una biblioteca para ayudar a resolverlo: pdfquery .
PDFQuery crea un árbol de elementos desde el PDF (usando pdfminer, con algo de azúcar adicional) y le permite buscar elementos de la página usando selectores JQuery o XPath, basados ​​principalmente en los contenidos de texto o las ubicaciones de los elementos. Por lo tanto, para analizar una tabla, primero debe encontrar dónde está en el documento buscando la etiqueta:
label = pdf.pq('':contains("Name of your table")'')
left_corner = float(label.attr(''x0''))
bottom_corner = float(label.attr(''y0''))
Luego, seguiría buscando líneas debajo de la tabla, hasta que la búsqueda no arrojara resultados:
page = label.closest(''LTPage'')
while 1:
row = pdf.extract( [
(''column_1'', '':in_bbox("%s,%s,%s,%s")'' % (left_corner+10, bottom_corner+40, left_corner+50, bottom_corner+20)),
(''column_2'', '':in_bbox("%s,%s,%s,%s")'' % (left_corner+50, bottom_corner+40, left_corner+80, bottom_corner+20))
], page)
if not row[''column_1''] or row[''column_2'']:
break
print "Got row:", matches
bottom_corner -= 20
Esto supone que sus filas tienen 20 puntos de altura, la primera comienza 20 puntos debajo de la etiqueta, la primera columna abarca de 10 a 50 puntos desde el borde izquierdo de la etiqueta, y la segunda columna abarca de 50 a 80 puntos desde la izquierda borde de la etiqueta.
Si tiene líneas en blanco o líneas con diferentes alturas, esto se volverá más molesto. También puede necesitar usar la opción merge_tags = None para seleccionar caracteres individuales en lugar de palabras, si las entradas en la tabla son lo suficientemente cercanas como para hacer que el analizador piense que es solo una línea. Pero espero que esto te acerque ...