2016-05-02 13 views
0

私はまだPython 3を学んでおり、これを達成するためにRequestsとBeautifulSoupを使用するプログラムを作ろうとしています。 私はこの両方のモジュールを使い慣れていません。Python 3 | Unicodeエラー|リクエストとBeautifulSoup

私はコードを解析する前にコードに保存しようとしているので、このエラーはUnicodeに関するものです。

エラー:

Traceback (most recent call last): 
    File "C:\Users\Gonçalo\Desktop\Coding\Python\Web Crawler\Image Retriver.py", line 25, in <module> 
    saveFile.write(soup) 
    File "C:\Python34\lib\encodings\cp1252.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u200e' in position 145890: character maps to <undefined> 

コード:任意の助け

import requests 
    from bs4 import BeautifulSoup 
    import os 


url = "https://www.google.pt/search?q=hello" 
req = requests.get(url) 
resp = req.text 
soup = BeautifulSoup(resp,"html.parser") 
soup = soup.prettify() 


dir_list = os.listdir() 
if "Image Retriever Files" not in dir_list: 
     os.makedir("Image Retriever Files") 
curDir = os.curdir 
filename = curDir+"/Image Retriever Files/Search Results.html" 
saveFile = open(filename,"w") 
saveFile.write(soup) 
saveFile.close() 

ありがとう!

答えて

0

これはあなたを近づけることができますが、他に問題がある場合は、try/exceptブロックでこれを囲み、elseを付けて拡張する必要があります。なぜなら、フォルダが存在していたら存在する場合はエラーが発生します)。

import requests 
from bs4 import BeautifulSoup 
import os 

url = "https://www.google.pt/search?q=hello" 
req = requests.get(url) 
resp = req.text 
soup = BeautifulSoup(resp, "html.parser") 
soup = soup.prettify() 

dir_list = os.getcwd() 
if "imageFile" not in dir_list: 
    os.mkdir("imageFile") 
curDir = os.curdir 
filename = curDir + "/imageFile/SearchResults.html" 
saveFile = open(filename, "wb") 
saveFile.write('files') 
saveFile.close() 

これが正しいパスに設定されたことを希望します。それがチェックボックスに当たった場合、私はここに助けを求めています。 よろしくお願いいたします。 Jason

0

これはthis questionと似ています。あなたの問題はユニコードの特徴です。最初はASCIIがあり、128文字が必要でした。

そして、明るい人たちは、キャラクターの8ビットがそれらに256文字を与えることを知っていました。それで、異なるシステムが他の言語のシンボルや文字に128-256の文字を使用するコードページが生まれました。また、256以上のシンボルを持つ言語では、ファイル内で複数の言語を表現したい、または天を禁じるまで、すべてがうまくいっていました。

そして、他の明るい人たちは、より多くのビットを使うと言っていました!しかし、16,32の数はいくつですか?しかし、私のファイルサイズが2倍または4倍にならないようにしたらどうでしょう?そしてもっとスマートな人たちは "シンプルにエンコーディングを使う"と言って、utf-8とISO 8859-1とそのilkで生まれました。そしてよりスマートな人々は、すべてのキャラクターとシンボルに彼らの本当の価値と数を与えることができたと言って、こうして生まれたユニコードです。

'\ u200e'は、左から右に表示されるテキストを示すユニコード文字です。これはキーボードに相当しません。
saveFile = open(filename、 "w")は標準テキストファイルに書き込もうとしており、すべての文字列を8ビットの値で書き込むことができると仮定しています。 'u200e'の小数は8,206です。あなたの問題を解決するには、明示的にutf-8のようなエンコーディングを選択する必要があります。そうすれば、あなたの文字列をファイルに読み込み可能に書くことができます。ファイルの種類をsaveFile = open(ファイル名、 "wb")に変更するだけで、ファイルを読み込んだり読み込んだりすることができます。

Joel Spolskyからのこの記事をチェックしてください。The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

関連する問題