Je suis en train de gratter un document HTML local. Cependant, quand je l'analyse avec une belle soupe, il renvoie le html dans un format moche (illustré dans la photo ci-dessous) qui est impossible à analyser.
Le le code simple que j'ai utilisé est:
path = 'alerts/myfile.htm' file = open(os.path.abspath(path)) parser = BeautifulSoup(file,'html.parser') file.close()
Cette chose me rend fou. Avez-vous déjà eu le même problème? Merci
3 Réponses :
Cela me semble un problème concernant l'encodage du fichier source.
Lors du chargement du document, BeautifulSoup le convertit en UTF-8, en utilisant une sous-bibliothèque appelée Unicode Dammit .
Il se peut que votre fichier ait été enregistré avec un encodage différent et une erreur s'est produite lors de la conversion.
Comme je n'ai pas votre code HTML à portée de main, je peux vous suggérer de vérifier si votre fichier est ASCII ou Unicode ou tout autre encodage, puis analyser le fichier avec :
parser = BeautifulSoup(file,'html.parser', from_encoding='utf-8')
D'autres options d'encodage peuvent être trouvées ici
Regards
UPDATE^
Essayez aussi:
encoding = <your encoding here> (example "iso-8859-8") parser = BeautifulSoup(file,'html.parser', from_encoding=encoding)
Il semble que le fichier original soit en UTF-16.
Quelle qu'en soit la raison, BeautifulSoup (..., from_encoding = 'utf-16le')
ne comprend pas cette situation, mais vous pouvez contourner ce problème en lisant et en décodant le fichier manuellement avant de passer vers BS.
Voir ci-dessous pour une transcription où je crée un fichier HTML qui est UTF-16LE, vider son contenu, essayer de le passer directement dans BS4 et enfin utiliser la solution de contournement décrite ci-dessus.
$ echo '<html><div>hello</div></html>' | iconv -f utf-8 -t utf-16le > y.html $ file y.html $ xxd y.html 00000000: 3c00 6800 7400 6d00 6c00 3e00 3c00 6400 <.h.t.m.l.>.<.d. 00000010: 6900 7600 3e00 6800 6500 6c00 6c00 6f00 i.v.>.h.e.l.l.o. 00000020: 3c00 2f00 6400 6900 7600 3e00 3c00 2f00 <./.d.i.v.>.<./. 00000030: 6800 7400 6d00 6c00 3e00 0a00 h.t.m.l.>... $ python >>> import bs4 >>> s = bs4.BeautifulSoup(open('y.html')) <html><div>hello</div></html> >>> s = bs4.BeautifulSoup(open('y.html'), from_encoding='utf-16le') <html><div>hello</div></html> >>> s = bs4.BeautifulSoup(open('y.html'), 'html.parser', from_encoding='utf-16le') <html><div>hello</div></html> >>> d = open('y.html', 'rb').read().decode('utf-16le') >>> d '<html><div>hello</div></html>\n' >>> s = bs4.BeautifulSoup(d) >>> s <html><div>hello</div></html> >>>
Je pense que je l'ai résolu: mon fichier était en encodage UCL-2. Ce que j'ai fait était:
path = 'alerts/myfile.htm' file = open(os.path.abspath(path),'rb') parser = BeautifulSoup(file.read().decode('utf-8'),'html.parser') file.close() parser.find('table', attrs = {'class':'MsoNormalTable'})
Voici maintenant le résultat:
pouvez-vous fournir le fichier html?
Malheureusement, je ne suis pas autorisé :(