2009-04-15 4 views
15

Sto cercando di pulire tutto l'HTML fuori da una stringa in modo che l'output finale sia un file di testo. Ho qualche ricerca sui vari 'convertitori' e sto iniziando a propendere per creare il mio dizionario per le entità e i simboli e eseguire una sostituzione sulla stringa. Sto considerando questo perché voglio automatizzare il processo e c'è molta variabilità nella qualità dell'html sottostante. Per iniziare a confrontare la velocità della mia soluzione e una delle alternative per esempio pyparsing ho deciso di testare la sostituzione di \ xa0 usando il metodo stringa replace. Ho unCome lavorare con unicode in Python

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128) 

La linea attuale del codice era

s=unicodestring.replace('\xa0','') 

Comunque, ho deciso che avevo bisogno di farla precedere da un r così mi sono imbattuto questa riga di codice:

s=unicodestring.replace(r'\xa0','') 

Funziona senza errori ma io quando guardo una porzione di s vedo che il \ xaO è ancora lì

+3

Perché dovresti prefisso '\ xa0' con una r? Questo lo rende una stringa grezza - cioè, letteralmente contiene il backslash, x, a, 0. Senza la r, conteneva un singolo carattere con codice esadecimale a0, che penso sia quello che volevi. –

+0

Perché stavo cercando di indovinare perché ho ricevuto l'errore e so che a volte per forzare il \ per essere letto devi renderlo un letterale stringa e anche il \ xa0 è ciò che effettivamente esiste nella mia fonte. qual è il codice esadecimale a0? – PyNEwbie

risposta

25

può essere che si dovrebbe fare

s=unicodestring.replace(u'\xa0',u'') 
+0

Quindi, come hai fatto a saperlo dal momento che non ho visto questo in nessun esempio? Grazie – PyNEwbie

+1

penso che le stringhe tra virgolette singole siano ascii .. quindi '\ xa0' genererà un'eccezione .. – z33m

3

Guarda il codecs libreria standard, in particolare la codifica codifica e decodifica metodi forniti nella classe base Codec.

C'è anche un buon articolo here che mette tutto insieme.

+0

Grazie-ottimo articolo hai ragione, mette molto insieme. – PyNEwbie

1

Solo una nota riguardante la pulizia dell'HTML. È molto molto difficile, dal

< 
body 
> 

È un modo valido per scrivere HTML. Solo un fyi.

0

È possibile convertire in Unicode in questo modo:

print u'Hello, \xa0World' # print Hello, World 
6
s=unicodestring.replace('\xa0','') 

..è cercando di creare il personaggio unicode \xa0, che è non valido in una sctring ASCII (il tipo di stringa predefinito in Python fino alla versione 3.x)

T Il motivo per cui l'errore r'\xa0' non è dovuto al fatto che in una stringa non elaborata le sequenze di escape non hanno alcun effetto. Piuttosto che cercare di codificare \xa0 nel personaggio unicode, ha visto la stringa come "backslash", "x letterale" e così via ..

Di seguito sono gli stessi:

>>> r'\xa0' 
'\\xa0' 
>>> '\\xa0' 
'\\xa0' 

Questo è qualcosa risolto in Python v3, come il tipo di stringa predefinita è unicode, quindi si può solo fare ..

>>> '\xa0' 
'\xa0' 

sto cercando di pulire tutto il codice HTML da una stringa in modo che il risultato finale è un testo file

Consiglio vivamente il BeautifulSoup per questo.Scrivere uno strumento di pulizia HTML è difficile (considerando quanto sia orribile la maggior parte HTML è), e BeautifulSoup fa un grande lavoro sia a HTML parsing, e si occupano di Unicode ..

>>> from BeautifulSoup import BeautifulSoup 
>>> soup = BeautifulSoup("<html><body><h1>Hi</h1></body></html>") 
>>> print soup.prettify() 
<html> 
<body> 
    <h1> 
    Hi 
    </h1> 
</body> 
</html> 
+0

Apprezzo questa risposta. Ho usato BS per estrarre i dati dalle tabelle ed è molto utile. Tuttavia, mi sembra che per rimuovere l'html usando BS devo sapere cosa è presente. Mi sbaglio? – PyNEwbie

+0

Non sono sicuro di cosa intendi? Puoi rimuovere HTML in innumerevoli modi, dalla prima tabella di un div, a class-class-or-id ecc. – dbr

+0

BeautifulSoup.prettyify() è stato solo un salvavita! Grazie! – Gourneau

2

Invece di questo, è meglio usare standard di Python Caratteristiche.

Ad esempio:

string = unicode('Hello, \xa0World', 'utf-8', 'replace') 

o

string = unicode('Hello, \xa0World', 'utf-8', 'ignore') 

dove replace sostituirà \xa0-\\xa0.

Ma se \xa0 non è davvero significativo per te e vuoi rimuoverlo, usa ignore.