代码之家  ›  专栏  ›  技术社区  ›  bjornasm

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

  •  3
  • bjornasm  · 技术社区  · 9 年前

    当我试图使用urllib在一个维基百科网站的URL中添加特殊字符时。请求和Python,我得到以下错误 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。使用utf-8编码的请求?

    4 回复  |  直到 9 年前
        1
  •  1
  •   mousetail    9 年前

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

    上面的答案不起作用,因为他是在处理请求后进行编码的,而您在处理请求时会遇到错误。

        2
  •  1
  •   Yohan D    9 年前

    如果可以选择使用库,我建议 requests

    # -*- coding: utf-8 -*-
    import requests
    r = requests.get('https://no.wikipedia.org/wiki/Jonas_Gahr_Støre')
    print(r.text)
    
        3
  •  0
  •   Daniel Lee    9 年前

    新计划-使用请求

    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()
    
        4
  •  -2
  •   Community Mohan Dere    9 年前

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