cari

Rumah  >  Soal Jawab  >  teks badan

网页爬虫 - 关于Python的编码与解码问题

在python2中用urllib模块去请求淘宝的IP地址查询接口,返回的是一段json字符串,如下所示:

import urllib


def get_data(ip):
    url = "http://ip.taobao.com/service/getIpInfo.php?ip=" + ip
    data = urllib.urlopen(url).read()

    return data


if __name__ == "__main__":
    result = get_data("59.151.5.5")
    print(result)

返回结果如下:

{"code":0,"data":{"country":"\u4e2d\u56fd","country_id":"CN","area":"\u534e\u5317","area_id":"100000","region":"\u5317\u4eac\u5e02","region_id":"110000","city":"\u5317\u4eac\u5e02","city_id":"110100","county":"","county_id":"-1","isp":"\u4e16\u7eaa\u4e92\u8054","isp_id":"100021","ip":"59.151.5.5"}}

在返回结果中,中文是以 unicode字符串表示,这样不方便阅读,我想让结果中中文部分直接用中文表示,就像下面这样:

"city":"北京","ISP":"中国电信"

如果是python3的话返回又是这样的:


    b'{"code":0,"data":{"country":"\\u4e2d\\u56fd","country_id":"CN","area":"\\u534e\\u5317","area_id":"100000","region":"\\u5317\\u4eac\\u5e02","region_id":"110000","city":"\\u5317\\u4eac\\u5e02","city_id":"110100","county":"","county_id":"-1","isp":"\\u4e16\\u7eaa\\u4e92\\u8054","isp_id":"100021","ip":"59.151.5.5"}}'

请问在 python2和python3中分别该如何转码呢?

高洛峰高洛峰2795 hari yang lalu597

membalas semua(4)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:33:42

    Terdapat dua kaedah dalam Python3 yang boleh menyelesaikan masalah anda:

    • fungsi print()

    Python3 mula mengekod sebagai UTF-8, jadi anda tahu, cuma cetak terus:

    >>> print("\u5317\u4eac\u5e02")
    北京市
    • Menggunakan pangkalan data Unikod

    Terdapat perpustakaan terbina dalam unicodedata, dan anda boleh memanggil dua kaedah dalam pustaka ini, seperti berikut:

    >>> import unicodedata as u
    
    # 这段字符串是来自你给提供的内容
    >>> s = "\u5317\u4eac\u5e02"
    >>> s1 = ''
    >>> for i in s:
            s1 += u.lookup(u.name(i))
    
    # 输出结果    
    >>> s1
    '北京市'

    Untuk menambah, jika anda memproses aksara secara individu, anda boleh menggunakan kaedah di atas, tetapi selepas menjawab tadi, saya mendapati bahawa nilai pulangan anda ialah objek bait Pemprosesan objek ini sangat mudah dalam Python3 seperti berikut:

    import urllib.request as r
    
    
    def get_data(ip):
        url = "http://ip.taobao.com/service/getIpInfo.php?ip=" + ip
        data = r.urlopen(url).read()
    
        return data
    
    
    if __name__ == "__main__":
        result = get_data("59.151.5.5")
        print(eval(result))

    Nilai pulangan selepas ujian saya ialah:

    {'data': {'area_id': '100000', 'isp': '世纪互联', 'country_id': 'CN', 'country': '中国', 'region_id': '110000', 'county_id': '-1', 'ip': '59.151.5.5', 'city': '北京市', 'area': '华北', 'county': '', 'city_id': '110100', 'isp_id': '100021', 'region': '北京市'}, 'code': 0}

    Berharap untuk menerima pakai

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:33:42

    Dalam Python 3, anda boleh menggunakan kaedah penyahkod untuk menukar bait kepada str:

        result = get_data("59.151.5.5").decode('raw_unicode_escape')

    balas
    0
  • PHPz

    PHPz2017-04-18 10:33:42

    Baguslah ===

    import json
    print json.dumps(json.loads(result), ensure_ascii=False)

    balas
    0
  • 阿神

    阿神2017-04-18 10:33:42

    Sila gunakan py3

    balas
    0
  • Batalbalas