2

これは、pycurlのsourceforgeページの例です。そして、URLに中国語のように含まれている場合。どのようなプロセスを行う必要がありますか?pycurlはUnicodeをサポートしていないので?

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()
4

3 に答える 3

1

3 つの個別の問題を示すスクリプトを次に示します。

  • Python ソース コードの非 ASCII 文字
  • URL の非 ASCII 文字
  • HTML コンテンツ内の非 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

注:utf-8コード内のすべては、互いに完全に独立しています。

  1. Unicode リテラルは、ファイルの先頭で定義した文字エンコーディングを使用します。テキストエディタがその設定を尊重していることを確認してください

  2. URL のパスは、utf-8パーセント エンコード (urlencoded) される前に、を使用してエンコードする必要があります。

  3. HTML ページの文字セットを見つける方法はいくつかあります。HTML の文字エンコーディングを参照 してください。requests@ Oz123 で言及されているような一部のライブラリは、自動的にそれを行います。

    # -*- 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. Unicode をコンソールに出力するには、PYTHONIOENCODING環境変数を使用して、端末が理解できる文字エンコーディングを設定します。

The Absolute Minimum Every Software Developers Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)および Python-specific Pragmatic Unicodeも参照してください。

于 2012-10-04T09:13:18.753 に答える
0

urllib.quoteを試してください。これにより、非ASCII文字がエスケープシーケンスに置き換えられます。

import urllib

url_to_fetch = urllib.quote(unicode_url)

編集:パスのみを引用符で囲む必要があります。完全なURLをurlparseで分割し、パスを引用符で囲んでから、urlunparseを使用してフェッチする最終的なURLを取得する必要があります。

于 2012-10-04T07:41:44.660 に答える