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