Python 3和BeautifulSoup4中的UnicodeEncodeError

时间:2017-10-15 00:22:24

标签: python encoding utf-8 beautifulsoup

运行我的代码时,我收到此错误

  

UnicodeEncodeError:'ascii'编解码器无法对位置71中的字符'\ u0303'进行编码:序号不在范围内(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,但它会出现此错误。

  

AttributeError:'str'/'bytes'对象没有属性'findAll'或

1 个答案:

答案 0 :(得分:0)

至少有一个图片src网址包含非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. 假设这些网址有效,并使用具有更好的unicode处理功能的库检索它们,例如requests

  2. 假设网址有效,但包含必须在传递给urlretrieve之前转义的unicode字符。这需要将url拆分为scheme,domain,path等,引用路径和任何查询参数,然后取消分割;所有这些工具都在urllib.parse包中(但这可能是请求所做的,所以只需使用请求)。

  3. 假设这些网址被破坏并通过urlretrieve

  4. 打包try/except UnicodeEncodeError来跳过这些网址