2010-10-25 61 views
2

64位VISTA
的Python 3.1的Python 3.1代碼和錯誤

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 

我不知道那是什麼錯誤表示。

請幫忙。

回答

1

當談到字節和(Unicode)字符串之間的區別時,Python 3更加嚴格。 urlopen(...).read(...)的結果當然是bytes類型的對象,而bytes.find的實現不允許您搜索Unicode字符串。你的情況,你可以簡單地通過二進制字符串替換「pricewrap」:

idx_pricewrap = b.find(b'pricewrap') 

同樣適用於其他.find電話。 Python 2自動將編碼的Unicode字符串編碼爲(更少或更多),但是Python 3引入了更多需要注意的限制。

+0

非常感謝。在我看到您的答案之前,我在文檔中找到了一個相關示例,我認爲您可以用不同的方式進行建議。我會回答我自己的問題來證明這一點。 – NotSuper 2010-10-25 21:15:43

+0

@NotSuper:是的,將網站解碼爲Unicode對象也是一個很好的解決方案。實際上它是更好的解決方案,但對於HTML網站,您可能更願意使用可自動檢測字符集的解析器庫(從HTTP頭或HTML內部的字符集定義,而不是採用UTF-8)。 – AndiDog 2010-10-25 21:37:04

+0

我想了解如何使用解析器庫。你能指點我一些例子嗎?我認爲我可以用3.1做什麼? – NotSuper 2010-10-26 00:11:48