pandas 将PDF中的组织名称列表转换为 Dataframe

xam8gpfp  于 2023-06-04  发布在  其他
关注(0)|答案(2)|浏览(87)

这里是a link to a PDF file
在第13页到第15页,有一系列的名字,我想组织在一个 Dataframe 。PDF中的名称在第13页和第14页的3列列表和第15页的2列列表中组织。为了将此列表存储为df,我想添加列名。
下面是第13页第一列的第一个元素的普通复制/粘贴:

AUVERGNE-RHÔNE-ALPES
24
01. AIN | 1 | Malafretaz Plage principale
03. ALLIER | 1 | Vieure Plage du plan d’eau
de Vieure
07. ARDÈCHE| 1 |Saint-Martin-d’Ardèche
Plage du Grain de sel
15. CANTAL | 1 | Trémouille Lastioulles

如果它是一个CSV,我会理想地重新组织它:

region,region_code,dpt_code,departement,flag,commune,plage
AUVERGNE-RHÔNE-ALPES,24,01.,AIN,| 1 |,Malafretaz,Plage principale
 , ,03.,ALLIER,| 1 |,Vieure,Plage du plan d’eau de Vieure
 , ,07.,ARDÈCHE,| 1 |,Saint-Martin-d’Ardèche,Plage du Grain de sel
 , ,15.,CANTAL,| 1 |,Trémouille,Lastioulles

下面是一段Python代码片段,我试图这样做,但当我组织列时,我遇到了一个错误:

import tabula
import pandas as pd

# Link to PDF
pdf_url = "https://www.teragir.org/wp-content/uploads/2023/05/DP-PAVBLEU-2023-WEB.pdf"

# Use Tabula to extrat the data on page 13 (I start with one single page)
df = tabula.read_pdf(pdf_url, pages=13)[0]

# Delete empty lines
df.dropna(inplace=True)

# Organize the columns
df.columns = ["Region", "Region_N", "Dpt_N", "Departement", "Flag", "Commune", "Plage"]

# Fill the missing values in the columns "Region" et "Region_N"
df["Region"].fillna(method="ffill", inplace=True)
df["Region_N"].fillna(method="ffill", inplace=True)

# Save the table in a CSV
df.to_csv("liste_plages.csv", index=False)
cbwuti44

cbwuti441#

如果使用边界框,则可以提取所需的文本并解析数据:

# pip install pymupdf
import fitz

doc = fitz.open('DP-PAVBLEU-2023-WEB.pdf')
s12 = doc[12].get_textbox(fitz.Rect(0, 180, 600, 750))
s13 = doc[13].get_textbox(fitz.Rect(0, 180, 600, 750))
s14 = doc[14].get_textbox(fitz.Rect(0, 130, 600, 400))
data = ''.join([s12, s13, s14])

输出:

>>> data
'AUVERGNE-RHÔNE-ALPES\n24 \n01. AIN | 1 \n | Malafretaz Plage principale \n03. ALLIER | 1 \n | Vieure Plage du plan d’eau \nde Vieure \n07. ARDÈCHE | 1  | Saint-Martin-d’Ardèche \nPlage du Grain de sel\n15. CANTAL | 1 \n | Trémouille Lastioulles\n43. HAUTE-LOIRE | 2 \n | Champagnac-le-\nVieux Plage du Plan d’eau | Le Bouchet-\nSaint-Nicolas Plage du lac du Bouchet \n74. HAUTE-SAVOIE | 9 \n | Evian-les-Bains \nPlage du Centre Nautique Evian | Neuvecelle \nGrande Rive | Publier Plage municipale \nAmphion-les-bains | Saint-Gingolph Plage \nmunicipale | Saint-Jorioz Plage municipale \n| Sciez-sur-Leman Sciez Municipale | \nThonon-les-Bains Plage de Saint-Disdille, \nPlage du Centre Nautique | Veyrier-du-Lac \nPlage La Brune\n63. PUY-DE-DÔME  | 7 \n |  Aubusson \nd’Auvergne \nPlage \ndu \nlac \nd’Aubusson \nd’Auvergne \n| \nAydat \nPlage \nd’Aydat \n| \nChambon-sur-Lac Plage de Chambon | \nCournon d’Auvergne Plan d’eau de Cournon \nd’Auvergne | Murol Grande plage du lac \nChambon de Murol | Saint-Rémy-Sur-\nDurolle Plan d’eau des Prades | Thiers Plan \nd’eau d’Iloa\n73. SAVOIE | 2 \n | Grésy-sur-Isère Base \nde loisirs de Grésy-sur-Isère | Saint-Pierre \nd’Albigny Plage du lac de Carouge \nBOURGOGNE-FRANCHE-COMTÉ \n3 \n21. CÔTE-D’OR | 1 \n |  Arnay-le-Duc Fouché \n39. JURA | 1 \n | Clairvaux-les-Lacs Plage \ndu Grand Lac de Clairvaux \n58. NIÈVRE | 1 \n | Montsauche-les-Settons \nPlage de la Presqu’île\nBRETAGNE \n33 \n (+3 nouvelles)\n29. FINISTÈRE | 21 \n | Audierne Plage \nde Trescadec, Plage de Trez Goarem* | \nBénodet Plage du Trez | Clohars-Carnoët \nBellangenet, \nGrands \nSables, \nKerrou \n| \nFouesnant-les Glénan Kerler, Maner Coat \nClevarec, \nKerambigorn, \nCap-Coz, \nGlénan \nSaint-Nicolas | Le Conquet Blancs Sablons, \nPortez, Pors Liogan | Moëlan-sur-Mer \nKerfany | Plouhinec Gwendrez, Mesperleuc | \nPlouarzel Plage de Porsman | Pouldreuzic \nPenhors | Roscoff Saint-Luc (Roc’h-Kroum) | \nSaint-Pol-de-Léon Sainte-Anne \n35. ILLE-ET-VILAINE | 3 \n | Iffendic Lac de \nTrémelin | Saint-Briac-sur-Mer La Salinette, \nPort Hue \n56. MORBIHAN | 9 \n | Carnac Saint-\nColomban, Grande Plage | Erdeven Kerouriec, \nKerhillio | Guidel La Falaise, Le Loc’h, Pen er \nMalo | Plouhinec Kervegant, Le Magouero\nCENTRE-VAL DE LOIRE \n2 \n36. INDRE | 1 \n | Eguzon-Chantôme \nChambon\n45. LOIRET | 1 \n | Châlette-sur-Loing Plage \nde Châlette\nCORSE \n5 \n (+1 nouvelle)\n2A. CORSE-DU-SUD | 5 \n | Ajaccio Trottel, \nTerre sacrée | Grosseto-Prugna Plage des \nTamaris | Pietrosella Plage du Ruppione | \nSerra di Ferro Porto Pollo\nHAUTS-DE-FRANCE \n4 \n59. NORD | 2 \n | Fourmies Plage des Etangs \ndes moines | Gravelines Petit Fort Philippe \n62. PAS-DE-CALAIS | 1 \n | Berck-sur-Mer \nPlage centre \n80. SOMME | 1 \n | Cayeux-sur-Mer Plage de \nla Ville\nÎLE-DE-FRANCE \n1 \n77. SEINE-ET-MARNE | 1 \n | Souppes-sur-\nLoing Baignade de Souppes-sur-Loing\nNORMANDIE \n19 \n \n14.  CALVADOS | 3  | Colleville-Montgomery \nColleville plage | Honfleur Plage du Butin | \nPont-l’Évêque Lac de Pont-l’Évêque\n50. MANCHE | 11 \n | Barneville-Carteret \nPlage de la Potinière, Plage de Barneville \n| Bréhal Plage de St-Martin-de-Bréhal | \nCarolles Carolles plage | Donville-les-\nBains plage du Lude | Granville Plage \ndu Plat-Gousset | Jullouville Le Casino, \nLes Plaisanciers | Les Pieux Sciotot | \nSaint-Pair-sur-Mer \nplage \nde \nKairon \n| \nSiouville-Hague Plage Cale John Hunter\n76. SEINE-MARITIME | 5 \n | Dieppe  Plage \nde Dieppe, Plage de Puys | Fécamp Plage de \nFécamp | Le Havre  Plage du Havre | Saint-\nJouin-Bruneval Saint-Jouin Plage\nNOUVELLE-AQUITAINE \n60 \n (+1 nouvelle)\n17. CHARENTE-MARITIME | 12  | La Rochelle \nChef de Baie, Les Minimes | Le-Bois-Plage-\nen-Ré Gros-Jonc, Les Gollandières | Le-\nGrand-Village-Plage Plage de la Giraudière \n| Royan Foncillon, La Grande Conche, Le Chay, \nLe Pigeonnier, Pontaillac |  Saint-Trojan-les-\nBains La grande plage, Gatseau \n19. CORRÈZE | 6 \n | Ambrugeat-Meymac \nLac de Séchemailles | Egletons Plage du lac \n| Liginiac Le Maury | Masseret Plan d’eau \nMasseret - Lamongerie | Neuvic d’Ussel La \nPlage | Treignac Plage des Bariousses \n24. DORDOGNE | 4 \n | Carsac de Gurson \nPlage du Lac de Gurson | La Jemaye-\nPonteyraud Plage du Grand Etang | Saint-\nEstèphe Plage du Grand Etang | Tamniès \nEtang de Loisirs de Tamniès \n33. GIRONDE | 11 \n | Bordeaux Plage du \nlac | Grayan et l’Hôpital Le Gurp, Plage de \ndépée (Euronat) | Hourtin Hourtin Océan, Lac \nLa Jetée (Plage du port), Lac Piqueyrot | Le \nVerdon-sur-Mer Plage de la Chambrette \n(Estuaire), Plage océanne de Saint-Nicolas | \nSoulac-sur-Mer L’Amélie, Plage Centrale, \nPlage des Naïades  \n87. HAUTE-VIENNE | 2 \n | Bussière-Galant \nEspace Hermeline | Saint Hilaire les Places \nLac plaisance\n40. LANDES | 2 \n | Seignosse Les Estagnots, \nLe Penon \n47. LOT-ET-GARONNE | 1 \n | Lougratte Lac \nde Lougratte \n64. PYRÉNÉES-ATLANTIQUES | 21 \n | \nAnglet Petite Chambre d’Amour, Les sables d’or, Marinella, Les Corsaires, La Madrague, \nL’Océan, Les cavaliers, La Barre | Biarritz \nMilady, Marbella, Côte des basques, Port Vieux, \nGrande Plage, Miramar | Bidart Ilbarritz, \nPavillon \nRoyal, \nErretegia, \nBidart \ncentre, \nParlementia | Hendaye Grande plage, Plage \ndes deux jumeaux \n86. VIENNE | 1 \n | Beaumont Saint-Cyr \nParc de Saint-Cyr\nOCCITANIE \n108 \n (+1 nouvelle)\n11. AUDE | 14 \n | Fleury d’Aude Les Cabanes \nde Fleury, Saint-Pierre-La-Mer | Gruissan \nGrazel, Les Chalets | Leucate La Franqui, \nLeucate Plage, Naturistes (Port Leucate), \nLe Kyklos, Copacabana (Port Leucate) | \nNarbonne-Plage Plage du Centre, Plage \ndes Karantes, Plage du Languedoc, Plage du \nCréneau Naturel | Port-la-Nouvelle  Plage du \nFront de Mer \n12. AVEYRON | 2 \n | Salles-Curan Plage des \nVernhes 1, Plage des Vernhes 2 \n30. GARD | 6  | Le-Grau-du-Roi Le Boucanet, \nRive Droite, Rive Gauche, Port Camargue Nord, \nPort Camargue Sud, Pointe de l’Espiguette\n32. GERS | 2 \n | Aignan Base de loisirs du lac  \n| Castera Verduzan Base de loisirs \n31. HAUTE-GARONNE | 1 \n | Montréjeau Lac \nMontréjeau \n34. HÉRAULT | 43 \n | Agde Grau d’Agde \n/ Saint Vincent, Le Môle, Plage Naturiste, \nRichelieu, La Roquille | Clermont-l’Hérault \nLac du Salagou - plage du camping | \nFrontignan la Peyrade L’entrée, Le Port, La \nBergerie, Les Aresquiers, Le Grau | La Grande \nMotte Grand Travers, Plage Echirolles, Plage \ndu Couchant / Rose des Sables, Saint Clair / \nPoint Zéro | La Salvetat-sur-Agout Plage \nLac de la Raviège - Gua des Brasses, Lac de la \nRaviège - Les Bouldouires | Marseillan Plage \nd’honneur, Robinson | Mauguio-Carnon \nCarnon Centre, Carnon / Degrasse, Carnon \nl’Avranche (De Grasse/Suffren), Carnon les \nDunes (secteur grand travers) | Palavas-\nles-Flots Rive Droite - L’Albatros, Rive Droite \n- Saint Pierre, Rive Gauche - Le Grec, Rive \nGauche - St Maurice, Rive Gauche - St Roch \n| Portiragnes La Redoute (Blockhaus), Le \nBosquet | Sète Plage des 3 Digues, Plage du \nCastellas, Plage du Lazaret, Plage de la Baleine, \nPlage de la Fontaine, Plage du Lido | Valras-\nPlage Casino, De Gaulle, Les Mouettes, \nPoste de secours central | Vias Farinette | \nVilleneuve-lès-Maguelone Plage du Pilou, \nPlage du Prévost \n46. LOT | 2 \n | Catus Plage Lac Vert | \nMontcuq-en-Quercy-Blanc Plage de Saint-\nSernin \n48. LOZÈRE | 1 \n | Villefort Lac de Villefort \n66. \nPYRÉNÉES-ORIENTALES | 31 \n | \nArgelès-sur-Mer Plage Centre-Pins, Plage \nde la Marenda-Tamariguer, Plage du Racou, \nPlage Sud | Banyuls-sur-Mer Plage Centrale \n| Canet-en-Roussillon Plage du Sardinal \n(Port-GCU), \nPlage \ndu \nRoussillon, \nPlage \nCentrale, Plage du Grand Large, Plage de la \nMarenda, Plage du Mar Estang | Cerbère \nPlage principale | Port-Barcarès Plage \ndu Lydia, Plage Digue Sud du Port, Plage du \nVillage | Port-Vendres Plage Bernardi, Plage \nde l’Usine | Saint-Cyprien Plage de l’Art \nPS1, Plage de l’Art PS2, Plage du Port, Plage \ndes Capellans, Plage de la Lagune | Sainte-\nMarie-la-Mer Plage du camping municipal, \nPlage du 1er Epi, Plage du 2ème Epi, Plage du \n3ème Epi, Plage du 4ème Epi, Plage Centrale | \nTorreilles Plage Centre, Plage Nord, Plage \nSud \n81.  TARN | 4 \n | Blaye-les-Mines Plage \nsainte marie  | Nages Plage de Rieu-Montagné \n| Rivières Baignade de Rivières - Aiguelèze | \nTrébas-les-Bains Base de loisirs de Trébas \n82. TARN-ET-GARONNE | 2 \n | Molières Lac \nPlage Sable | Monclar-de-Quercy Lac Plage \ncoté Toboggan\nOUTRE-MER\n15 \n97. LA RÉUNION | 5 \n | Saint-Leu Plage \ncentre Poste MNS | Saint-Paul Plage Boucan \nCanot (Piscine), Plage Boucan Canot, Plage \nRoches Noires, Plage Ermitage Centre La \nPasse\n98. \nPOLYNÉSIE \nFRANÇAISE | 10 \n | \nBora Bora Plage publique Matira, Plage \nHôtel Maitai Polynesia, Complexe sportif \nTeriimaevarua (Salle Omnisport Pago), Plage \nHôtel Intercontinental Thalasso Resort & \nSpa, Plage Hôtel St Régis, Plage Hôtel Four \nSeasons, Plage snack Matira, Plage Hôtel \nIntercontinental Moana Beach, Plage Hôtel \nPearl Beach, Plage Hôtel Conrad\nPAYS DE LA LOIRE\n46 \n (+2 nouvelles)\n44. LOIRE-ATLANTIQUE | 30 \n | La Baule-\nEscoublac Face à l’Avenue du Général de \nGaulle, Face à l’Avenue de la Grande Dune, \nFace à l’Esplanade Benoît | La Bernerie-\nen-Retz Grande Plage, Plan d’eau Maurice \nGiros | La Turballe Les Bretons 1, Pen \nBron (V.V.F), Ker Élisabeth | Le Pouliguen \nLe Nau | Plessé Etang de Buhel | Pornic \nBirochère, \nL’étang, \nLa \nNoeveillard, \nLe \nPorteau, La Source | Pornichet Bonne \nSource, Sainte-Marguerite, Les Libraires | \nPréfailles L’Anse du Sud, Port Meleu, Grande \nPlage | Saint-Brevin-les-Pins Plage de \nl’Ermitage, Plage des Rochelets | Saint-\nMichel-Chef-Chef Plage de Gohaud, La \ngrande plage de Tharon, Plage du Redois | \nSaint-Philbert-de-Grand-Lieu Plage du \nparc de la boulogne | Saint-Nazaire Plage \nde M. Hulot, Plage de la Courance, Plage des \nJaunais \n72. SARTHE | 1 \n | La Flèche Plage de La \nMonnerie\n85. \nVENDÉE | 15 \n | L’Aiguillon-la-\nPresqu’île Grand’Plage, Plage de la Barrique, \nPlan d’eau | Jard-sur-Mer Boisvinet, La \nMine | La Tranche-sur-Mer La Terrière, Les \nGenerelles, Plage centrale, La Grière, Sainte \nAnne, La Porte des Iles, Corps de garde, Flandre \nDunkerque | Notre-Dame-de-Monts Plage \nCentrale | Talmont-Saint-Hilaire Le VeillonPROVENCE-ALPES-CÔTE D’AZUR \n86 \n (+1 nouvelle)\n04. ALPES-DE-HAUTE-PROVENCE | 1 \n | \nUbaye Serre-Ponçon Plage de Saint Vincent \nles forts\n06. ALPES-MARITIMES | 15 \n | Antibes \nAntibes-les-Pins Est, Antibes-les-Pins Ouest, \nFontonne Est, Fontonne Ouest, Fort Carré, \nLes Groules, Marineland | Cannes Chantiers \nnavals, Trou (Roubine), Font de Veyre, Ile \nSainte Marguerite Est, Ile Sainte Marguerite \nOuest, Rochers de la Bocca, Saint Georges | \nNice Saint Hélène\n13. BOUCHES-DU-RHÔNE | 10 \n | Berre \nl’Etang Plage de Champigny - quartier des \nMerveilles | Cassis Plage du Bestouan, Plage \nde la Grande Mer | Fos-sur-Mer Cavaou, \nGrande Plage | La Ciotat Plage Cyrnos | \nMarignane Plage du Jaï Nord | Port de \nBouc Bottai | Saint Chamas Plage des \ncabassons | Sausset-les-Pins Corniche \n05. HAUTES-ALPES | 8 \n | Chorges Plage \ndes Trémouilles, Plage de la Baie Saint-Michel \ndu-Lac Port Saint Pierre (plage) | Savines-\nle-Lac Savin’Plage, Plage de la Combette\n83. VAR | 52 \n | Bandol Plage du Grand \nVallat, Plage du Casino, Plage Centrale, Plage \nRenécros | Hyères \nAyguade, Almanarre \nNord, La Bergerie, Les Salins | La Croix-\nValmer Gigaro, La Douane Le Débarquement | \nLa Londe-les-Maures L’Argentière, Miramar, \nTamaris \n| La-Seyne-sur-Mer \nSablettes \nCentre, \nSablettes \nEst \n| Le \nLavandou \nAnglade, Cavalière, la Fossette, Lavandou \nville, Pramousquier, Saint Clair, Aiguebelle \n| Le Pradet Les Bonnettes, La Garonne, \n| Le Pin de Galle, Le Monaco, Les Oursinières \nRoquebrune-sur-Argens \nGaillarde, \nSan peire | Saint-Mandrier-sur-Mer La \nCoudoulière, La Vieille, Touring, Le Canon, \nSaint-Asile \n| \nSaint-Raphaël \nPéguière, \nVeillat, Boulouris, Dramont, Camp Long, Agay, \nPourousset, Baumette, Anthéor | Sainte-\nMaxime Garonnette, La Croisette, La Nartelle, \nCentre-ville \n| Six-Fours-Les-Plages, \nLa \nCoudouliere, Les Roches Brunes | Toulon \nMistral, Plage du Lido, Plage de la Source'

现在您可以解析数据。

rjee0c15

rjee0c152#

pdfplumber允许您完全自定义其表提取过程。
https://github.com/jsvine/pdfplumber#extracting-tables
以下是一个有用的例子:

在这里,我们使用以下标准隔离01.标题:

  • 他们的字体名称以“黑色”结尾
  • 它们的文本内容以数字开头
  • 文本内容以.结尾

有了所有的标题,我们就可以检测到列的边缘。
然后我们裁剪出该列,并提取每个标题上方的水平线,实际上是在每个条目周围创建一个“框”,以将文本捕获为一个表格单元格。
这仅提取第一列,即以edges[0], edges[1]为例:

words = [ 
   word for word in page.extract_words(extra_attrs=["fontname"]) 
   if word['fontname'].endswith('Black') and word['text'][0].isdigit() 
]

COL_WIDTH = 20
x0 = words[0]['x0']
edges = [x0]

for word in words:
   if word['x0'] - x0 > COL_WIDTH:
      x0 = word['x0']
      edges.append(x0)
      
edges.append(page.bbox[-2])

col = page.crop((edges[0], page.bbox[0], edges[1], page.bbox[-1]))

# 0 adds the top of the page as a line to get any leading text
hlines = [0] + [ 
   line['top'] for line in col.extract_text_lines() 
   if line['chars'][0]['fontname'].endswith('Black') 
   and line['chars'][0]['text'].isdigit() 
   and line['text'].split()[0][-1] == '.' 
]

col.extract_table(dict(
   explicit_vertical_lines=col.bbox, 
   explicit_horizontal_lines=hlines
))
[['Palmarès plages\n406 plages labellisées\nRetrouvez cet été toutes ces pla\nAUVERGNE-RHÔNE-ALPES\n24'],
 ['01. AIN | 1 | Malafretaz Plage principale'],
 ['03. ALLIER | 1 | Vieure Plage du plan d’eau\nde Vieure'],
 ['07. ARDÈCHE | 1 | Saint-Martin-d’Ardèche\nPlage du Grain de sel'],
 ['15. CANTAL | 1 | Trémouille Lastioulles'],
 ['43. HAUTE-LOIRE | 2 | Champagnac-le-\nVieux Plage du Plan d’eau | Le Bouchet-\nSaint-Nicolas Plage du lac du Bouchet'],
...

第2列和第3列以拆分单元格的内容开始,因此您需要添加逻辑来检查和合并,但这可能比直接解析文本更简单。

相关问题