2013-08-19 23 views
7

Vorrei fare alcune analisi su alcune proprietà elencate in un'asta imminente. Sfortunatamente, la città che gestisce l'asta non pubblica le informazioni in un formato strutturato ma fornisce invece un 700+ page PDF delle proprietà in vendita all'asta.Cercare consigli su come convertire PDF in formato strutturato

Mi chiedo se la comunità abbia qualche idea su come posso affrontare l'analisi di detto PDF in un formato strutturato per l'inserimento in un db o per creare un foglio di calcolo delle proprietà.

Ecco un'immagine di ciò che ogni pagina rappresenta: Property Guide

Ed ecco una pagina che elenca alcune proprietà: Sample List of Properties

mi sento a mio agio con Python e Ruby quindi non ho problemi Scripting una soluzione, ma poiché le "colonne" ei dati in quelle colonne non sono necessariamente legati insieme, sembra che questa sarebbe una proposta dubbia.

Qualsiasi idea sarebbe molto apprezzata.

+0

Il mio pensiero sarebbe quello di utilizzare un pdf al convertitore del testo e quindi analizzare il file di testo (assumendo che il convertitore ti dà un formato di output prevedibile). –

+0

Sì, ci ho provato. C'è un progetto rubino che ho provato (https://github.com/kitplummer/pdftohtmlr) e sputa fuori spazzatura. – doremi

+0

Che dire del testo? Sembra che faccia html. –

risposta

1

Convertire il testo con Xpdf tramite il comando pdftotext.

ho convertito il file con il seguente:

pdftottext.exe -layout -f 23 -l 510 AuctionBook2013.pdf AuctionBook2013.txt 

Questa conversione lascia testo esattamente nel suo layout originale (a causa di -layout opzione). Le opzioni -f e -l indicano il numero della prima e dell'ultima pagina dell'intervallo di pagine da estrarre.

Da lì, l'analisi dovrebbe essere semplice: un numero nella colonna 8 indica la prima riga di un record, una riga vuota termina il record. Segui la guida per il posizionamento esatto degli elementi all'interno di un record.

1

Dopo aver passato un po 'di tempo con questo per 3 ore, sono riuscito a creare un documento XML parseable dai dati. Sfortunatamente, non sono riuscito a mettere insieme una serie di passaggi completamente riutilizzabili che potrei utilizzare per le future pubblicazioni sulle aste.

Per inciso, ho tentato di chiamare e chiedere alla Contea di Los Angeles se potevano fornire un formato alternativo delle proprietà all'asta (excel, ecc.) E la risposta era no. Questo è il governo per te.

Ecco una vista di alto livello del mio approccio:

  • Convertire il PDF in un file di testo utilizzando Poppler
  • Usa RegEx foo per ripulire e creare nodi XML dai dati
  • Usa un beautifier/validator XML per trovare errori e fare pulizia
  • Usa Python/ruby ​​per aggiungere il nodo Link di Google Maps e il link alla mappa degli Assessor della contea di LA (http://assessormap.co.la.ca.us/mapping/rolldata.asp?ain=APN-GOES_HERE) e
  • Conversione XML in formato CSV con Ruby

ho usato http://xmlbeautifier.com/ come mio XML beautifier/validatore perché era veloce e ha dato accurata segnalazione degli errori, compresi i numeri di riga.

Usa Homebrew installare Poppler per Mac:

brew install poppler 

Dopo aver installato Poppler, si dovrebbe avere accesso al programma di utilità pdftotext per convertire il file PDF:

pdftotext -layout -f 24 -l 687 AuctionBook2013.pdf auction_book.txt 

Ecco un'anteprima del XML (Click here for full XML):

<?xml version="1.0" encoding="UTF-8"?> 
<listings> 
    <item id="1"> 
     <nsb>536</nsb> 
     <minbid>3,422</minbid> 
     <apn>2006 003 001</apn> 
     <delinquent_year>03</delinquent_year> 
     <apn_old>2006 003 001</apn_old> 
     <description>LICENSED SURVEYOR'S MAP 
      AS PER BK 25 PG 28 OF L S LOT 1    
      BLK 1 ASSESSED TO J AND S 
      LIMITED LLC C/O DUNA CSARDAS - 
      JULIUS JANCSO LOCATION COUNTY OF 
      LOS ANGELES</description> 
     <address>VACANT LOT</address> 
    </item> 

Modifica: aggiunta del Ruby Ho scritto per convertire l'XML in un CSV.

require 'rexml/document' 
require 'CSV' 

class Auction 

    def initialize 

    f = File.new('AuctionBook2013.xml', 'r') 
    doc = REXML::Document.new(f) 

    CSV.open("auction.csv", "w+b") do |csv| 
     csv << ['id', 'minbid', 'apn', 'delinquent_year', 'apn_old', 'description', 'address'] 

     doc.elements.each('/listings/item') do |item| 
     csv << [item.attributes['id'], 
       item.elements['minbid'].text, 
       item.elements['apn'].text, 
       item.elements['delinquent_year'].text, 
       item.elements['apn_old'].text, 
       item.elements['description'].text, 
       item.elements['address'].text] 
     end 
    end 
    end 
end 

a = Auction.new() 

Link to Final CSV

Problemi correlati