使用 urllib 读取 url 时出现编码错误

Encoding error when reading url with urllib

当我尝试使用 urllib.request 和 Python 抓取 URL 中带有特殊字符的维基百科网站时,出现以下错误 UnicodeEncodeError: 'ascii' codec can't encode character '\xf8' in position 23: ordinal not in range(128)

代码:

# -*- coding: utf-8 -*-
import urllib.request as ur

url = "https://no.wikipedia.org/wiki/Jonas_Gahr_Støre"
r = ur.urlopen(url).read()

如何使用 urllib.request 和 utf-8 编码?

新计划 - 使用请求

from bs4 import BeautifulSoup
import requests

def scrape():
    url = "http://no.wikipedia.org/wiki/Jonas_Gahr_Støre"
    r = requests.get(url).content
    soup = BeautifulSoup(r).encode('utf-8')

    print soup

    print r

if __name__ == '__main__':
    scrape()

显然,urllib 只能处理 ASCII 请求,将您的 url 转换为 ascii 会导致您的特殊字符出现错误。 用 %C3%B8 替换 ø,这是在 http 中对这个特殊字符进行编码的正确方法,似乎可以解决问题。但是,我找不到像您的浏览器那样自动执行此操作的方法。

示例:

>>> f="https://no.wikipedia.org/wiki/Jonas_Gahr_St%C3%B8re"
>>> import urllib.request
>>> g=urllib.request.urlopen(f)
>>> text=g.read()
>>> text[:100]
b'<!DOCTYPE html>\n<html class="client-nojs" lang="nb" dir="ltr">\n<head>\n<meta charset="UTF-8"/>\n<title'

上面的回答不行,因为他是在请求处理完之后再编码,而你在请求处理的时候报错

如果可以选择使用库,我会推荐很棒的 requests

# -*- coding: utf-8 -*-
import requests
r = requests.get('https://no.wikipedia.org/wiki/Jonas_Gahr_Støre')
print(r.text)

使用 我为我需要的字符编写了自定义编码器:

def properEncode(url):
  url = url.replace("ø", "%C3%B8")
  url = url.replace("å", "%C3%A5")
  url = url.replace("æ", "%C3%A6")
  url = url.replace("Ø", "%C3%98")
  url = url.replace("Å", "%C3%A5")
  url = url.replace("Æ", "%C3%85")
  return url