2017-04-11 2 views
0

Le code suivant fonctionne très bien lorsqu'il est exécuté de portable Jupyter IPython:Code BeautifulSoup fonctionne dans IPython Notebook, mais pas Eclipse

from bs4 import BeautifulSoup 
xml_file_path = "<Path to XML file>" 
s = BeautifulSoup(open(xml_file_path), "xml") 

Mais il échoue lors de la création de la soupe lorsqu'il est exécuté à partir d'Eclipse/PyDev (qui utilise le même Python interprète):

Traceback (most recent call last): 
    File "~/parser/scratch.py", line 3, in <module> 
    s = BeautifulSoup(open(xml_file), "xml") 
    File "/anaconda/lib/python3.5/site-packages/bs4/__init__.py", line 175, in __init__ 
    markup = markup.read() 
    File "/anaconda/lib/python3.5/encodings/ascii.py", line 26, in decode 
    return codecs.ascii_decode(input, self.errors)[0] 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 1812: ordinal not in range(128) 
  • Python version: 3.5.2 (Anaconda 4.1.1)
  • BeautifulSoup: la version 4
  • IPython version portable: 4.2.1
  • version d'Eclipse: Mars.2 Release (4.5.2)
  • version PyDev: 5.1.2.20160623256
  • Mac OS X: El Capitan 10.11.6

MISE À JOUR: Le caractère dans le fichier qui pose problème dans Eclipse est , mais cela ne cause aucun problème dans IPython Notebook! Si je supprime ce caractère du fichier XML, le code fonctionne également correctement dans Eclipse. Y a-t-il un réglage dans Eclipse que j'ai besoin de changer pour que le code n'échoue pas sur ce caractère (et éventuellement un autre tel)?

+0

Copie possible de [UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xef en position 1] (http://stackoverflow.com/questions/10561923/unicodedecodeerror-ascii-codec-cant-decode-byte-0xef- en-position-1) – DyZ

+0

@DYZ - Il n'y a pas d'impression ici. Cela arrive quand je crée la soupe. – arun

+0

Avez-vous essayé 'open (xml_file_path," utf-8 ")'? –

Répondre

0

Je pense que vous devez ouvrir avec open (xml_file_path, 'rb') - et spécifier le codage pour que les choses fonctionnent de la même manière dans les deux (sinon vous avez une conversion implicite de bytes en unicode - et apparemment, il utilise un encodage différent basé sur votre env, puisque vous avez quelque chose dans Eclipse et une autre chose dans IPython).

Essayez de faire:

with open(xml_file_path, 'rb') as stream: 
    contents = stream.read() 
    contents.decode('utf-8') 

Juste pour vérifier si vous êtes vraiment capable de décoder comme utf-8 (i.e. .: pour vérifier si ce caractère est un utf-8 valide char).