2012-10-04 44 views
1

這是pycurl的sourceforge頁面上的例子。如果url包含中文。我們應該做什麼過程?由於pycurl不支持unicode?當url包含非英語語言時如何使用pycurl?

import pycurl 
c = pycurl.Curl() 
c.setopt(pycurl.URL, "http://www.python.org/") 
c.setopt(pycurl.HTTPHEADER, ["Accept:"]) 

import StringIO 
b = StringIO.StringIO() 
c.setopt(pycurl.WRITEFUNCTION, b.write) 
c.setopt(pycurl.FOLLOWLOCATION, 1) 
c.setopt(pycurl.MAXREDIRS, 5) 
c.perform() 
print b.getvalue() 
+0

我從來沒有使用pycurl,但似乎沒有維護。我建議你嘗試更現代的圖書館,如請求,http://docs.python-requests.org/en/latest/。 – Oz123

回答

0

嘗試urllib.quote,這將是一個轉義序列代替非ASCII字符:

import urllib 

url_to_fetch = urllib.quote(unicode_url) 

編輯:只有路徑放在引號,你將不得不與分裂的裏urlparse完整的URL ,引用路徑,然後使用urlunparse獲取最終的URL以獲取。

+0

我假設OP的意思是「頁面內容」不是ascii,而不是url字符串本身。 – jfs

1

以下是一個演示三個獨立的問題的腳本:在Python源代碼

  • 非ASCII字符的URL在HTML內容
  • 非ASCII字符
  • 非ASCII字符
# -*- coding: utf-8 -*- 
import urllib 
from StringIO import StringIO 
import pycurl 

title = u"UNIX時間" # 1 
url = "https://zh.wikipedia.org/wiki/" + urllib.quote(title.encode('utf-8')) # 2 

c = pycurl.Curl() 
c.setopt(pycurl.URL, url) 
c.setopt(pycurl.HTTPHEADER, ["Accept:"]) 

b = StringIO() 
c.setopt(pycurl.WRITEFUNCTION, b.write) 
c.setopt(pycurl.FOLLOWLOCATION, 1) 
c.setopt(pycurl.MAXREDIRS, 5) 
c.perform() 

data = b.getvalue() # bytes 
print len(data), repr(data[:200]) 

html_page_charset = "utf-8" # 3 
html_text = data.decode(html_page_charset) 
print html_text[:200] # 4 

注:所有代碼中的彼此完全獨立。

  1. 的Unicode文本使用任何字符編碼,你在 頂部的文件的定義。確保你的文本編輯器方面,在URL設置

  2. 路徑應使用utf-8之前,它是編碼 百分比編碼(urlencoded的)

  3. 有幾種方法找出一個html頁面字符集。見 Character encodings in HTML。通過@ Oz123所提到的一些庫,如requests自動做到這一點:

    # -*- coding: utf-8 -*- 
    import requests 
    
    r = requests.get(u"https://zh.wikipedia.org/wiki/UNIX時間") 
    print len(r.content), repr(r.content[:200]) # bytes 
    print r.encoding 
    print r.text[:200] # Unicode 
    
  4. To print Unicode to console你可以使用PYTHONIOENCODING environment variable來設置你的終端了解

參見The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)字符編碼和Python特定Pragmatic Unicode

相關問題