2017-10-15 5 views
0

私のコードを実行しているとき、私はこのエラーを取得するはPython 3でUnicodeEncodeErrorをしてBeautifulSoup4

UnicodeEncodeError: 'ascii' codec can't encode character '\u0303' in position 71: ordinal not in range(128)

これは私の全体のコード、

from urllib.request import urlopen as uReq 
from urllib.request import urlretrieve as uRet 
from bs4 import BeautifulSoup as soup 
import urllib 

for x in range(143, 608): 
    myUrl = "example.com/" + str(x) 
    try: 
     uClient = uReq(myUrl) 
     page_html = uClient.read() 
     uClient.close() 
     page_soup = soup(page_html, "html.parser") 

     container = page_soup.findAll("div", {"id": "videoPostContent"}) 

     img_container = container[0].findAll("img") 
     images = img_container[0].findAll("img") 

     imgCounter = 0 

     if len(images) == "": 
      for image in images: 
       print('Downloading image from ' + image['src'] + '...') 
       imgCounter += 1 
       uRet(image['src'], 'pictures/' + str(x) + '.jpg') 
     else: 
      for image in img_container: 
       print('Downloading image from ' + image['src'] + '...') 
       imgCounter += 1 
       uRet(image['src'], 'pictures/' + str(x) + '_' + str(imgCounter) + '.jpg') 
    except urllib.error.HTTPError: 
     continue 

しようとしたソリューションです:私は、追加しようとした

.encode/decode('utf-8').text.encode/decode('utf-8')page_soupですが、このエラーが発生します。画像のsrc URLの

AttributeError: 'str'/'bytes' object has no attribute 'findAll' or

+1

であなたのurlretrieve呼び出しをラップすることにより、それらをスキップ? –

+0

page_soupを文字列に変換することは、もはやBeatifulSoupオブジェクトではないことを意味します。だからあなたは 'findAll'を使うことはできません。どのラインがエラーを投げていますか? – TheF1rstPancake

+0

at uRet()[それはurlretrieveです] – Axis

答えて

0

少なくとも一方は、非ASCII文字が含まれている、とurlretrieveはそれらを処理することができません。

>>> url = 'http://example.com/' + '\u0303' 
>>> urlretrieve(url) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    ... 
UnicodeEncodeError: 'ascii' codec can't encode character '\u0303' in position 5: ordinal not in range(128) 

この問題を回避するには、次のいずれかの方法を試してください。

  1. は、これらのURLが有効であると仮定し、requestsのように、より良いUnicodeの取り扱いを持っているライブラリを使用してそれらを取得します。

  2. URLは有効ですが、urlretrieveに渡す前にエスケープする必要があるユニコード文字が含まれているとします。これは、スキーム、ドメイン、パスなどにURLを分割し、パスとクエリパラメータを引用して分割しないでください。これのためのすべてのツールはurllib.parseパッケージに含まれています(ただし、これはおそらく何らかの要求が行われるため、リクエストを使用するだけです)。

  3. は、これらのURLが壊れていると仮定し、そのエラーがスローされているものラインでtry/except UnicodeEncodeError

関連する問題