2010-10-25 10 views
2

Vista 64 bits
Python 3,1Python 3.1 code et erreur

from urllib import request 
a = request.urlopen('http://www.marketwatch.com/investing/currency/CUR_USDYEN').read(20500) 
b = a[19000:20500] 
idx_pricewrap = b.find('pricewrap') 
context = b[idx_pricewrap:idx_pricewrap+80] 
idx_bgLast = context.find('bgLast') 
rate = context[idx_bgLast+8:idx_bgLast+15] 
print(rate) 
 
Traceback (most recent call last): 
File "c:\P31Working\test_urllib.py", line 4, in 
    idx_pricewrap = b.find('pricewrap') 
TypeError: expected an object with the buffer interface 
Process terminated with an exit code of 1 

Je ne sais pas ce que cela signifie erreur.

Aidez-nous s'il vous plaît.

Répondre

1

Python 3 est beaucoup plus strict quand il s'agit de la différence entre les octets et les chaînes (Unicode). Le résultat de urlopen(...).read(...) est bien sûr un objet de type bytes, et l'implémentation de bytes.find ne vous permet pas de rechercher des chaînes Unicode. Dans votre cas, vous pouvez simplement remplacer « pricewrap » par une chaîne binaire:

idx_pricewrap = b.find(b'pricewrap') 

même pour les autres .find appels. Python 2 a encodé des chaînes Unicode automatiquement là où cela a fait sens (moins ou plus), mais Python 3 a introduit plus de restrictions dont vous devez être conscient.

+0

Merci beaucoup. Avant que j'ai vu votre réponse, j'ai trouvé un exemple pertinent dans les documents, qui je pense fait ce que vous suggérez d'une manière différente. Je vais répondre à ma propre question pour le montrer. – NotSuper

+0

@NotSuper: Oui, le décodage du site Web en un objet Unicode est également une bonne solution. En fait, c'est la meilleure solution, mais pour les sites HTML, vous préférerez peut-être utiliser une bibliothèque d'analyseurs capable de détecter automatiquement le jeu de caractères (à partir de l'en-tête HTTP ou de la définition de charset au lieu du format UTF-8). – AndiDog

+0

Je voudrais apprendre à utiliser une bibliothèque d'analyseurs. Pourriez-vous me montrer quelques exemples? Je suppose que je pourrais le faire avec ce que 3.1 a? – NotSuper

Questions connexes