python3中的urlopen對於中文url是如何處理的?

urllib.request.urlopen("http://www.sina.com.cn"),如果url中有中文怎麼辦,Python3不是默認採用utf-8編碼的嗎?


剛剛看了urllib.parse.quote()的定義,完全可以直接處理中英混排的url,無需單獨處理中文再拼接。具體方法:

# -*- coding:utf-8 -*-

from urllib.parse import quote

url = "http://www.example.com/api.php?text=中文在這裡"

# 不帶附加參數
print("
不帶附加參數:
%s" % quote(url))

# 附帶不轉換字元參數
print("
附加不轉換字元參數:
%s" % quote(url, safe="/:?="))

運行結果:

不帶附加參數:

http%3A//www.example.com/api.php%3Ftext%3D%E4%B8%AD%E6%96%87%E5%9C%A8%E8%BF%99%E9%87%8C

附加不轉換字元參數:

http://www.example.com/api.php?text=%E4%B8%AD%E6%96%87%E5%9C%A8%E8%BF%99%E9%87%8C

quote可用的參數如下:

quote(string, safe="/", encoding=None, errors=None)

其中的safe參數可用的範圍:

reserved = ";" | "/" | "?" | ":" | "@" | "" | "=" | "+" | "$" | ","

這樣對於爬取來的混合中文的url可以直接處理了。


url當中不可能有中文,因為url可以使用的字元有限制,所有其他字元都應該使用url編碼,你應該先把中文編碼成%XX這樣的形式再拼起來


今天我剛剛解決了這個問題。

首先,url中的中文要單獨處理,不能中英文全部合在一起處理(因為一部分的特殊字元也會被處理掉)。其次。在python3.0+中,已經不支持之前的urllib.quote了,而是需要urllib.parse.quote(str)

一種可行的方案

import urllib

s=『中文』

s=urllib.parse.quote(s)

url="some english url character %s"%(s)

urllib.request.urlopen(url)

祝你好運


from urllib.parse import quote
import string

url = r"http://baike.baidu.com/item/人民的名義/17545218"
url = quote(url, safe = string.printable) # safe表示可以忽略的字元
print(url)


今天寫爬蟲也遇到了這個問題,搜了一下,解決方案如下:

  1. import urllib.parse;
  2. url = "http://www.baidu.com/s?wd=" +urllib.parse.quote("中國")

其實這種轉換是時時刻刻存在的,比如,可以在google上搜關鍵詞「百度」,然後觀察瀏覽器的地址欄顯示的內容(注意q=後面的內容)

至於進一步,這個問題為什麼回發生呢?

其實很好理解,因為HTTP協議是ASCII編碼的形式呀~~~

所以。。。中文必須要變成字母然後才能正確編碼為位元組流,然後發到網路中。。。

好在。。。python的urllib已經為我們提供了轉換方法。。。嗯,就是上面那個,調用一下就好。。。

最後不得不說。。。

人生苦短,我用python!


剛剛解決這個問題

代碼如下:

from urllib import request
from urllib.parse import quote

from bs4 import BeautifulSoup

def is_chinese(uchar):
if uchar &>= u"u2E80" and uchar &<= u"uFE4F": return True else: return False html = request.urlopen(some url) soup = BeautifulSoup(html, "html.parser") i = 1 for a in map(lambda x: x["src"], soup.find_all("img")): result = str() for c in a: if is_chinese(c): c = quote(c) result += c print(result) i += 1 f = open("d:/pachong/" + str(i) + ".jpg", "wb") f.write(request.urlopen(result).read()) f.close()


自己調試了一上午,看到答案豁然開朗 謝謝大神


語法變化太大了 難搞


推薦閱讀:

如何用 C 語言在 Windows 編寫一個遊戲?
C 語言進階有哪些優秀的代碼可以閱讀?
有哪些非常好的前端網站或個人博客?
如何評價HEOI/SXOI/SHTSC/LNOI/JLOI/HLOI2017?
世界頂級開源軟體工程師,他們如何謀利?

TAG:互聯網 | 程序員 | Python | 編程 |