2017-09-23 62 views
1

我目前正在在Python和我們的美麗的湯單元中的課程時,教練使用下面的代碼爲Unicode錯誤:獲取打印美化BeautifulSoup

import requests, pprint 
from bs4 import BeautifulSoup 

url = 'https://www.epicurious.com/search/tofu%20chili' 
response = requests.get(url) 
page_soup = BeautifulSoup(response.content, 'lxml') 
print(page_soup.prettify()) 

當我運行這段代碼,我得到以下錯誤:

Traceback (most recent call last): 
    File "/Users/arocklin/Documents/Python/whiteboard2.py", line 11, in <module> 
    print(page_soup) 
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 1479: ordinal not in range(128) 

我想知道爲什麼我得到了這一點,因爲它的工作對他以及我如何修復它前進。謝謝!

+0

更新:當我將最後一行改爲:print(results_page.prettify(encoding ='utf-8'))也不打印整齊,並以字符串打印。當我從終端運行它時,它工作正常,但是當我從Atom運行它時,我遇到了問題 – anonym00se

+0

也許只需添加'#!/ usr/bin/env python # - * - coding:utf-8 - * - '作爲Python文件中的前兩行,如[在Python源代碼中使用utf-8編碼](https://stackoverflow.com/q/6289474/1248974) – davedwards

+0

謝謝!不過,我認爲這是Atom的問題,因爲UTF-8是Python 3中的默認編碼。當我將該行放在頂部時,問題仍然是 – anonym00se

回答

0

您的問題與BeautifulSoup或解析HTML無關。您的代碼達到幷包括BeautifulSoup.prettify可讓您在不受您控制的網絡服務器中定義some unicode string

或多或少任意unicode字符串,然後嘗試打印。

在Python已經確定終端sys.stdout只能處理ascii編碼字符串的系統上,並且如果web服務器(由於完全超出您的控制的原因)決定給出ASCII範圍之外的一些Unicode字符,Python無法編碼該字符並引發異常。

我建議你研究一下你的Python版本是如何決定在你運行Python的平臺上使用的編碼/編解碼器。

然後把一個測試用例插入到你的程序的測試套件中,它實際驗證它可以正確輸出Unicode字符串。對於那個測試,你可以替換你的整個程序

print(u"foo\xe9bar") 
+0

非常感謝。由於某些原因,這個問題似乎與Atom有關。不知道你是否知道任何解決方案。我在Mac OS Sierra 10.12上使用Atom V 1.20.1 x64。我的終端可以打印輸出,但由於某種原因,atom有問題。 – anonym00se