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

3
当我尝试使用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?


尝试在文件开头写入以下内容?# -- coding: utf-8 -- - Swakeert Jain
Python的版本?Unicode处理在2.x和3.x系列之间发生了巨大的变化。 - Łukasz Rogalski
你可以试试这个:.r = ur.urlopen(url.decode('cp1252')).read() - Jean-François Fabre
属性错误:'str'对象没有属性'decode' @Jean-FrançoisFabre - bjornasm
1
可能是含有乌克兰字符导致UnicodeEncodeError的URL的重复问题。 - ivan_pozdeev
4个回答

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'

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

谢谢。我可以编写一个手动转换器来获取我需要的字符。 - bjornasm
有一个函数可以引用URL,因为这个问题的重复显示。 - ivan_pozdeev
是的,但是urlquote将转义URL中的斜杠和特殊字符。 - mousetail
默认情况下,它不会转义斜杠(但会转义冒号)。有 urlparse.urlspliturlparse.urlunsplit 可以只处理特定的部分。 - ivan_pozdeev

1

如果使用库是一个选项,我建议使用优秀的requests

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

0
新计划 - 使用 requests
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()

谢谢您的回答 - 然而,遗憾的是我仍然得到相同的错误。 - bjornasm

-2

使用@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

https://dev59.com/tprga4cB1Zd3GeqPlFI8#IwwZoYgBc1ULPQZFhwJ2 - ivan_pozdeev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接