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(string, safe="/", encoding=None, errors=None)
reserved = ";" | "/" | "?" | ":" | "@" | "" | "=" | "+" | "$" | ","
url當中不可能有中文,因為url可以使用的字元有限制,所有其他字元都應該使用url編碼,你應該先把中文編碼成%XX這樣的形式再拼起來
今天我剛剛解決了這個問題。首先,url中的中文要單獨處理,不能中英文全部合在一起處理(因為一部分的特殊字元也會被處理掉)。其次。在python3.0+中,已經不支持之前的urllib.quote了,而是需要urllib.parse.quote(str)一種可行的方案import urllibs=『中文』
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)
今天寫爬蟲也遇到了這個問題,搜了一下,解決方案如下:
- import urllib.parse;
- 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?
※世界頂級開源軟體工程師,他們如何謀利?