3
votes

BeautifulSoup renvoie du texte espacé après l'analyse

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.

 entrez la description de l'image ici

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


2 commentaires

pouvez-vous fournir le fichier html?


Malheureusement, je ne suis pas autorisé :(


3 Réponses :


1
votes

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)


0 commentaires

2
votes

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'))
&lt;html&gt;&lt;div&gt;hello&lt;/div&gt;&lt;/html&gt;
>>> s = bs4.BeautifulSoup(open('y.html'), from_encoding='utf-16le')
&lt;html&gt;&lt;div&gt;hello&lt;/div&gt;&lt;/html&gt;
>>> s = bs4.BeautifulSoup(open('y.html'), 'html.parser', from_encoding='utf-16le')
&lt;html&gt;&lt;div&gt;hello&lt;/div&gt;&lt;/html&gt;
>>> 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>
>>>


0 commentaires

1
votes

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:

entrez la description de l'image ici


0 commentaires