2009-04-16 26 views
5

Sono un noob in vero pitone quindi per favore abbiate pazienza con me. Voglio che Python esegua la scansione di una pagina di html e sostituisca le istanze di Microsoft Word con qualcosa di compatibile con UTF-8.Alcune domande Python di base

La mia domanda è, come si fa a farlo in Python (ho cercato su Google questo, ma non ho trovato una risposta chiara finora)? Voglio immergere l'alluce nelle acque di Python, quindi immagino che qualcosa di semplice come questo sia un buon punto di partenza. Sembra che avrei bisogno di:

  1. carico testo incollato da MS Word in una variabile
  2. corsa una sorta di funzione di sostituzione sui contenuti
  3. output

In PHP vorrei fai così:

$test = $_POST['pasted_from_Word']; //for example “Going Mobile” 

function defangWord($string) 
{ 
    $search = array(
     (chr(0xe2) . chr(0x80) . chr(0x98)), 
     (chr(0xe2) . chr(0x80) . chr(0x99)), 
     (chr(0xe2) . chr(0x80) . chr(0x9c)), 
     (chr(0xe2) . chr(0x80) . chr(0x9d)), 
     (chr(0xe2) . chr(0x80) . chr(0x93)), 
     (chr(0xe2) . chr(0x80) . chr(0x94)), 
     (chr(0x2d)) 
    ); 

    $replace = array(
     "‘", 
     "’", 
     "“", 
     "”", 
     "–", 
     "—", 
     "–" 
    ); 

    return str_replace($search, $replace, $string); 
} 

echo defangWord($test); 

Come lo faresti in Python?

EDIT: Hmmm, ok ignorare la mia confusione su UTF-8 e le entità per il momento. L'input contiene il testo incollato da MS Word. Cose come le virgolette ricci appaiono come simboli dispari. Varie funzioni PHP che ho provato a sistemare non mi davano i risultati che volevo. Visualizzando quei simboli dispari in un editor esadecimale ho visto che corrispondevano ai simboli che ho usato sopra (0xe2, 0x80 ecc.). Quindi ho semplicemente scambiato i personaggi stravaganti con le entità HTML. Quindi se il bit che ho sopra è già UTF-8, cosa viene incollato da MS Word che causa i simboli dispari?

EDIT2: Così ho deciso di imparare un po 'di Python e ho scoperto che non capisco veramente la codifica. Il problema che stavo cercando di risolvere può essere gestito semplicemente avendo una codifica incisiva da un capo all'altro. Se il modulo di input è UTF-8, il database che archivia l'input è UTF-8 e la pagina che lo emette è UTF-8 ... incollare da Word funziona correttamente. Non sono necessarie funzioni speciali. Ora, riguardo l'apprendimento di un piccolo Python ...

+1

+1: "defangWord()" ... Lo adoro! :-) –

risposta

20

Prima di tutto, quelle non sono entità Microsoft Word: sono UTF-8. Li stai convertendo in entità HTML.

Il modo Pythonic per scrivere qualcosa di simile:

chr(0xe2) . chr(0x80) . chr(0x98) 

sarebbe:

'\xe2\x80\x98' 

Ma Python ha già funzionalità incorporate per il tipo di conversione che si vuole fare:

def defang(string): 
    return string.decode('utf-8').encode('ascii', 'xmlcharrefreplace') 

Questo sostituirà i codici UTF-8 in una stringa per caratteri come con entità numeriche come “.

Se si desidera sostituire quelle entità numeriche con quelli nominati, ove possibile:

import re 
from htmlentitydefs import codepoint2name 

def convert_match_to_named(match): 
    num = int(match.group(1)) 
    if num in codepoint2name: 
     return "&%s;" % codepoint2name[num] 
    else: 
     return match.group(0) 

def defang_named(string): 
    return re.sub('&#(\d+);', convert_match_to_named, defang(string)) 

e usarlo in questo modo:

>>> defang_named('\xe2\x80\x9cHello, world!\xe2\x80\x9d') 
'“Hello, world!”' 

Per completare la risposta, il codice equivalente a il tuo esempio per elaborare un file sarebbe simile a questo:

# in Python, it's common to operate a line at a time on a file instead of 
# reading the entire thing into memory 

my_file = open("test100.html") 
for line in my_file: 
    print defang_named(line) 
my_file.close() 

Si noti che questa risposta è rivolta a Python 2.5; la situazione Unicode è drammaticamente diversa per Python 3+.

Sono anche d'accordo con il commento di Bobince qui sotto: se si può semplicemente mantenere il testo in formato UTF-8 e inviarlo con il tipo di contenuto e il set di caratteri corretti, farlo; se hai bisogno che sia in ASCII, allora rimani con le entità numeriche: non c'è davvero bisogno di usare quelle nominate.

+0

+1 per xmlcharrefreplace - oggi non c'è bisogno di entità con nome HTML. Ma in realtà, lascia l'UTF-8 da solo, le virgolette intelligenti intatte. Finché la servi con l'intestazione/meta-tag "charset" corretta non ci sono problemi. – bobince

+0

+1 per indicare che le entità sono UTF-8 e non alcune stranezze MS ;-) (e anche per una risposta scritta nel complesso) –

+0

Sono confuso. Il documento che sto importando nell'esempio è pieno di strani simboli che corrispondono a virgolette inglesi MS Word. Se li metto direttamente in una pagina con la codifica UTF-8 ottengo strani simboli. Se li converto usando il mio codice di esempio, rendono bene. Quindi, cosa sono prima di convertirmi? – Stuart

3

Il codice Python ha lo stesso schema.

Basta sostituire tutti gli isistemi PHP con Python-isms.

Inizia creando un oggetto File. Il risultato di un file.read() è un oggetto string. Le stringhe hanno un'operazione di "sostituzione".

2

La soluzione migliore per la pulizia di Word HTML sta utilizzando HTML Tidy che ha una modalità solo per quello. Ci sono a few Python wrappers che è possibile utilizzare se è necessario farlo a livello di programmazione.

1

Come detto da S.Lott, il codice Python sarebbe molto, molto simile - le uniche differenze sarebbero essenzialmente le chiamate/istruzioni di funzione.

Non credo Python ha un equivalente diretto a file_get_contents(), ma dal momento che è possibile ottenere un allineamento delle righe nel file, è possibile unirsi a loro per nuove righe, come questo:

sample = '\n'.join(open(test, 'r').readlines()) 

EDIT : non importa, c'è un modo molto più semplice: sample = file(test).read()

String sostituzione è quasi esattamente la stessa str_replace():

sample = sample.replace(search, replace) 

e l'output è così semplice come una dichiarazione print:

print defang_word(sample) 

Quindi, come si può vedere, le due versioni sembrano quasi esattamente la stessa cosa.

+0

file ('foo.txt'). Read() – Justus

+0

Buona chiamata modificata. – hbw

+0

@Justus, non sarebbe 'descrittore di file perdita di file (nome) .read()', dal momento che non si chiama mai vicino? –

Problemi correlati