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

时间:2016-08-30 13:53:37

标签: python 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()

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

4 个答案:

答案 0 :(得分:1)

显然,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'

上面的答案不起作用,因为他在处理请求后进行编码,而在请求处理期间出现错误。

答案 1 :(得分:1)

如果使用库是一个选项,我会建议真棒requests

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

答案 2 :(得分:0)

新计划 - 使用请求

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()

答案 3 :(得分:-1)

使用answer from @mousetail我为我需要的角色编写了一个自定义编码器:

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