2009-04-15 18 views
15

Estoy tratando de limpiar todo el HTML de una cadena para que el resultado final sea un archivo de texto. Tengo un poco de investigación sobre los diversos 'convertidores' y estoy empezando a inclinarme hacia la creación de mi propio diccionario para las entidades y los símbolos y ejecutar un reemplazo en la cadena. Estoy considerando esto porque quiero automatizar el proceso y hay mucha variabilidad en la calidad del html subyacente. Para comenzar a comparar la velocidad de mi solución y una de las alternativas, por ejemplo, pyparsing, decidí probar la sustitución de \ xa0 con el método de cadena replace. Consigo unCómo trabajar con Unicode en Python

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

La línea real de código fue

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

De todos modos, decidí que tenía que prefacio con una r por lo que corrí esta línea de código:

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

Se ejecuta sin error pero cuando miro un trozo de s veo que el \ xaO todavía está allí

+3

¿Por qué prefijarías '\ xa0' con una r? Eso lo convierte en una cadena en bruto, es decir, literalmente contiene barras invertidas, x, a, 0. Sin la r, contenía un único carácter con código hexadecimal a0, que creo que es lo que usted quería. –

+0

Porque estaba tratando de adivinar por qué recibí el error y sé que a veces para obligar a la \ a leer hay que hacer una cadena literal y también \ xa0 es lo que realmente existe en mi fuente. ¿Qué es el código hexadecimal a0? – PyNEwbie

Respuesta

25

puede ser que debería estar haciendo

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

Entonces, ¿cómo supiste hacer esto ya que no he visto esto en ningún ejemplo? Gracias – PyNEwbie

+1

creo que las cadenas en comillas simples son ascii ... así que '\ xa0' levantará una excepción .. – z33m

3

Mire el codecs biblioteca estándar, específicamente la codifica y decodifica métodos proporcionados en la clase base del Codec.

También hay un buen artículo here que lo pone todo junto.

+0

Gracias, gran artículo, tienes razón, reúne mucho. – PyNEwbie

1

Solo una nota con respecto a la limpieza de HTML. Es muy muy difícil, ya que

< 
body 
> 

Es una forma válida de escribir HTML. Solo un fyi.

0

Puede convertirlo en Unicode en esta forma:

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

..es tratando de crear el carácter Unicode \xa0, que es no válido en una configuración ASCII (el tipo de cadena predeterminado en Python hasta la versión 3.x)

T El motivo r'\xa0' no error es porque en una cadena sin formato, las secuencias de escape no tienen ningún efecto. En lugar de intentar codificar \xa0 en el carácter Unicode, se vio la cadena como una "barra invertida", "x literal" y así sucesivamente ..

Los siguientes son los mismos:

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

Este es algo resuelto en Python v3, como el tipo de cadena por defecto es unicode, lo que sólo puede hacer ..

>>> '\xa0' 
'\xa0' 

que estoy tratando de limpiar todo el HTML de una cadena por lo que el resultado final es un texto archivo

Recomiendo encarecidamente BeautifulSoup para esto.Escribir una herramienta de limpieza HTML es difícil (dado lo horrible la mayoría HTML es), y BeautifulSoup hace un gran trabajo tanto en el análisis de HTML, y tratar con 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

Agradezco esta respuesta. He usado BS para extraer datos de tablas y es muy útil. Sin embargo, me parece que para eliminar el html utilizando BS tengo que saber qué está presente. ¿Estoy equivocado sobre eso? – PyNEwbie

+0

No estoy seguro de lo que quieres decir? Puede eliminar HTML de innumerables maneras, desde la primera tabla en un div, hasta by-class-or-id, etc. – dbr

+0

BeautifulSoup.prettyify() era solo un salvavidas. ¡Gracias! – Gourneau

2

En lugar de esto, es mejor utilizar estándar de Python caracteristicas.

Por ejemplo:

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

o

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

donde replace reemplazará \xa0-\\xa0.

Pero si \xa0 realmente no es significativo para usted y desea eliminarlo, utilice ignore.