web-dev-qa-db-fra.com

Python 3 UnicodeDecodeError: le codec 'charmap' ne peut pas décoder l'octet 0x9d

Je veux faire un moteur de recherche et je suis un tutoriel sur certains sites web. Je veux tester l'analyse HTML

from bs4 import BeautifulSoup

def parse_html(filename):
    """Extract the Author, Title and Text from a HTML file
    which was produced by pdftotext with the option -htmlmeta."""
    with open(filename) as infile:
        html = BeautifulSoup(infile, "html.parser", from_encoding='utf-8')
        d = {'text': html.pre.text}
        if html.title is not None:
            d['title'] = html.title.text
        for meta in html.findAll('meta'):
            try:
                if meta['name'] in ('Author', 'Title'):
                    d[meta['name'].lower()] = meta['content']
            except KeyError:
                continue
        return d

parse_html("C:\\pdf\\pydf\\data\\muellner2011.html")

et il obtient une erreur

UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 867: character maps to <undefined>enter code here

J'ai vu quelques solutions sur le Web en utilisant l'encode (). Mais je ne sais pas comment insérer la fonction encode () dans le code. Quelqu'un peut-il m'aider?

22
Fakhriyanto

Dans Python 3, les fichiers sont ouverts sous forme de texte (décodés en Unicode) pour vous; vous n'avez pas besoin de dire à BeautifulSoup à partir de quel codec décoder.

Si le décodage des données échoue, c'est parce que vous n'avez pas dit à la fonction open() quel codec utiliser lors de la lecture du fichier; ajoutez le codec correct avec un argument encoding:

with open(filename, encoding='utf8') as infile:
    html = BeautifulSoup(infile, "html.parser")

sinon, le fichier sera ouvert avec le codec par défaut de votre système, qui dépend du système d'exploitation.

48
Martijn Pieters