2012-10-04 43 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

相关问题