Comment travailler avec unicode en Python
-
09-09-2019 - |
Question
Je suis en train de nettoyer tout le code HTML sur une chaîne de sorte que le résultat final est un fichier texte. J'ai quelques des recherches sur les différents « convertisseurs » et je commence à pencher vers la création de mon propre dictionnaire pour les entités et les symboles et l'exécution d'une chaîne sur la remplacer. Je considère cela parce que je veux automatiser le processus et il y a beaucoup de variabilité de la qualité du html sous-jacente. Pour commencer à comparer la vitesse de ma solution et l'une des alternatives, par exemple pyparsing j'ai décidé de tester remplacer de \ xa0 en utilisant la méthode de chaîne remplacer. Je reçois un
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 0: ordinal not in range(128)
La ligne de code a été
s=unicodestring.replace('\xa0','')
En tout cas, j'ai décidé que je devais préfacer avec un r alors j'ai couru cette ligne de code:
s=unicodestring.replace(r'\xa0','')
Il fonctionne sans erreur mais je quand je regarde une tranche de s je vois que le \ XAO est toujours là
La solution
peut être que vous devriez faire
s=unicodestring.replace(u'\xa0',u'')
Autres conseils
s=unicodestring.replace('\xa0','')
.. tente de créer le caractère unicode \xa0
, ce qui est valable dans un sctring ASCII (le type de chaîne par défaut en Python jusqu'à ce que la version 3.x)
La r'\xa0'
raison n'a pas d'erreur est parce que dans une chaîne brute, des séquences d'échappement n'a pas d'effet. Plutôt que d'essayer de coder \xa0
dans le caractère unicode, il a vu la chaîne comme un « anti-slash », « x littérale » et ainsi de suite ..
Les éléments suivants sont les mêmes:
>>> r'\xa0'
'\\xa0'
>>> '\\xa0'
'\\xa0'
Ceci est quelque chose résolu dans v3 Python, comme le type de chaîne par défaut est unicode, vous pouvez juste faire ..
>>> '\xa0'
'\xa0'
Je suis en train de nettoyer tout le code HTML sur une chaîne de sorte que le résultat final est un fichier texte
Je recommande fortement BeautifulSoup pour cela. Rédaction d'un outil de nettoyage HTML est difficile (étant donné la plus terrible HTML est), et BeautifulSoup fait un excellent travail à la fois HTML analyse syntaxique, et de traiter avec Unicode ..
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup("<html><body><h1>Hi</h1></body></html>")
>>> print soup.prettify()
<html>
<body>
<h1>
Hi
</h1>
</body>
</html>
Regardez le codecs bibliothèque standard, en particulier les encode et décodage méthodes fournies dans la classe de base codec.
Au lieu de cela, il est préférable d'utiliser les fonctionnalités standard de Python.
Par exemple:
string = unicode('Hello, \xa0World', 'utf-8', 'replace')
ou
string = unicode('Hello, \xa0World', 'utf-8', 'ignore')
où replace
remplacera \xa0
à \\xa0
.
Mais si \xa0
est vraiment pas de sens pour vous et que vous voulez le retirer puis utilisez ignore
.
Juste une note concernant le nettoyage HTML. Il est très très difficile, puisque
<
body
>
est un moyen valable d'écrire HTML. Juste un FYI.
Vous pouvez le convertir en unicode de cette façon:
print u'Hello, \xa0World' # print Hello, World