Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:当正文为空时,字符串索引必须为整数_Python - Fatal编程技术网

Python TypeError:当正文为空时,字符串索引必须为整数

Python TypeError:当正文为空时,字符串索引必须为整数,python,Python,我正在使用一种公共可用的方法,使用musixmatch api获取曲目的歌词。此方法包含以下部分: json_obj = json.loads(raw.decode('utf-8')) body = json_obj["message"]["body"]["lyrics"]["lyrics_body"] 如果曲目中有歌词关联,则print(json_obj)将以这种格式返回: {'message': {'header': {'status_code': 200, 'execut

我正在使用一种公共可用的方法,使用musixmatch api获取曲目的歌词。此方法包含以下部分:

    json_obj = json.loads(raw.decode('utf-8'))
    body = json_obj["message"]["body"]["lyrics"]["lyrics_body"]
如果曲目中有歌词关联,则print(json_obj)将以这种格式返回:

{'message': {'header': {'status_code': 200, 'execute_time': 0.0032379627227783}, 'body': {'lyrics': {'lyrics_id': 1290130, 'can_edit': 0, 'locked': 0, 'action_requested': '', 'verified': 0, 'restricted': 1, 'instrumental': 0, 'explicit': 0, 'lyrics_body': '', 'lyrics_language': 'en', 'lyrics_language_description': 'English', 'script_tracking_url': 'https://tracking.musixmatch.com/t1.0/m_js/e_1/sn_0/l_1290130/su_0/tr_3vUCAELvdbv2u68t6EhkMnd-8HjFVDR8ySJtVDvx1wu2t7bIHzQn4QjBnewHmPfaFosJFYkWv3dp_LyRwBhUrXjOsX9TA-28yzdsLebCvaG9shILvno8F94Mm6EuA6PvOiTKdFVL6hW2DSHd2uQQbOF-URNHli0NCOG2mnJS7i_pRvQM6jbzTs8GWGmfkz6SPG6SiRAw7OD1_ALUcvL6DWgqTDzzQyn1mxFzSyUWB5ddJTf3oTmgBoRKQKJJqiO6h2S6T40I73gio9TzqXUMeTjB7jKbL7pm-ma6s4zx-uAlRzVKvyEMxjJGks6p2CKu_NE3MZ26VcV4EVhaL0QcXsmVW49T064RtrZFc4qY9gqHoc_wreBVUPoftX1SWDPGzG4HZOiRXpj-V_YIvaLA2QAVsAVcBkwi9Zmb0onjsHTbknSmzO-6kcez0zrFc44LZOQ45of1eATGIVI/', 'pixel_tracking_url': 'https://tracking.musixmatch.com/t1.0/m_img/e_1/sn_0/l_1290130/su_0/tr_3vUCAAVtFUMcReVeKMMElPrsIdyf5IcOQyLMIduxSpy9U549RTNLfGorynAbS03DhldhcSFwWs_f9EiFdRepDw_HGQFZC6-hNtxts2M9eU1uD2Ga8RXdRq9pgm29WoAj8zcfH45WsO-tAfyA3oajqe-momfl2S4n51WgrBj4RxpmZ3DhrilGRO1Rhq5rqTyXRLG86fM7Hi0Bh2hXrXg115SiPywxjuMzLR2DMmGvu_Q--jjtFU38jTurZCsdtJ8slsdpvUzUo5Rs0EKdxboiopgPdTScdSQ-J3NRlXq8CFlK0j78ZMGo8KI9ZwdfMag5gPo5hI56PdcsAkfLkmvGjE2einZMruGrZVy08cZxAX7_ZdhXuLUY3RvleHog089sBJnzXDVqi7zb2yZSxrxYENQZuSR7KjR1fDN45I18ingQsAHXy18mJ6CUzWkrzwpV0-XAeNBe2d5mG9M/', 'html_tracking_url': 'https://tracking.musixmatch.com/t1.0/m_html/e_1/sn_0/l_1290130/su_0/tr_3vUCAEHn0YKFfsSIWi8uC0aMlSrJxMwAjYKks94IRU-wF13uNtElVESehNa14ZOa5h19bOKSN10QRhFF4V-Jwo6DLkoN5VVBVDpw9pqL5Ff0--pA2EUtqzvjZb3Z35J2V51RY9AFv6VYWgQ6Nm7ijSbRcbnjyqB3rvCbhUNqN_egIfyVPkDCjZZnyFIs5Vt8teA7zLE2ms5EDF6NphXfezUcsDZfN8hBtT8lvd_EjunDSKs7QaCMHmi8YV7aSiLWyFeQKBzKWm-YRq2z9kyXtcreXlGagr6UHazj88UTK_LO_TzT99BO4XKJwmQ1ARm8-c4nug9kxUic3EvDxS0CNclEXAuKdKpzZvE25PQZUb_dCyPNvCVHHV4C1XtlmOVXoRET6fuguSHlA7Hg7TqDo_PP8cbR-Q4_VeromQ4evewwzWrrNQQSA4VX0Z78Ll5nKF9lYVa5wWQTWi8/', 'lyrics_copyright': "Unfortunately we're not authorized to show these lyrics.", 'writer_list': [], 'publisher_list': [], 'backlink_url': 'https://www.musixmatch.com/lyrics/Bruce-Springsteen/No-Surrender?utm_source=application&utm_campaign=api&utm_medium=none%3A1409616623501', 'updated_time': '2010-06-29T03:43:49Z'}}}}
但如果曲目没有歌词,则返回时身体是空的:

{'message': {'header': {'status_code': 404, 'execute_time': 0.0011160373687744}, 'body': []}}
Traceback (most recent call last):

当主体为空时,会出现以下错误:

in song_lyric
    body = json_obj["message"]["body"]["lyrics"]["lyrics_body"]
TypeError: string indices must be integers
{'message': {'header': {'status_code': 401, 'execute_time': 0.00022006034851074}, 'body': ''}}
要解决此问题,请使用:

 if json_obj["message"]["body"] != "" and json_obj["message"]["body"] != []:
            print(json_obj)
            body = json_obj["message"]["body"]["lyrics"]["lyrics_body"]
但它不起作用,我也有同样的问题。你知道为什么吗

完成方法

def song_lyric(song_name,artist_name):
    while True:
        querystring = apiurl_musixmatch + "matcher.lyrics.get?q_track=" + urllib.parse.quote(song_name) + "&q_artist=" + urllib.parse.quote(artist_name) +"&apikey=" + apikey_musixmatch + "&format=json&f_has_lyrics=1"
        #matcher.lyrics.get?q_track=sexy%20and%20i%20know%20it&q_artist=lmfao
        request = urllib.request.Request(querystring)
        #request.add_header("Authorization", "Bearer " + client_access_token)
        request.add_header("User-Agent", "curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)") #Must include user agent of some sort, otherwise 403 returned
        while True:
            try:
                response = urllib.request.urlopen(request, timeout=4) #timeout set to 4 seconds; automatically retries if times out
                raw = response.read()
                #print(raw)
            except socket.timeout:
                print("Timeout raised and caught")
                continue
            break
        json_obj = json.loads(raw.decode('utf-8'))
        if json_obj["message"]["body"] != "":
            print(json_obj)
            body = json_obj["message"]["body"]["lyrics"]["lyrics_body"]
            copyright = json_obj["message"]["body"]["lyrics"]["lyrics_copyright"]
            tracking_url = json_obj["message"]["body"]["lyrics"]["html_tracking_url"]
            if(tracking_url!= ""):
                #print(body)
                #print(tracking_url)
                lyrics_tracking(tracking_url)
                return (body + "\n\n" +copyright)
            else:
                return "None"
        else:
            return "None"

def lyrics_tracking(tracking_url):
    while True:
        querystring = tracking_url
        request = urllib.request.Request(querystring)
        #request.add_header("Authorization", "Bearer " + client_access_token)
        request.add_header("User-Agent", "curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)") #Must include user agent of some sort, otherwise 403 returned
        try:
            response = urllib.request.urlopen(request, timeout=4) #timeout set to 4 seconds; automatically retries if times out
            raw = response.read()
        except socket.timeout:
            print("Timeout raised and caught")
            continue
        break
        print(raw)

我认为完整方法部分与前面的代码不同。也许这就是问题所在。如果是这种情况,只需添加之前显示的空列表检查即可修复:

您还可以使用中的
执行这些多重检查:

def song_lyric(song_name,artist_name):
    while True:
        querystring = apiurl_musixmatch + "matcher.lyrics.get?q_track=" + urllib.parse.quote(song_name) + "&q_artist=" + urllib.parse.quote(artist_name) +"&apikey=" + apikey_musixmatch + "&format=json&f_has_lyrics=1"
        #matcher.lyrics.get?q_track=sexy%20and%20i%20know%20it&q_artist=lmfao
        request = urllib.request.Request(querystring)
        #request.add_header("Authorization", "Bearer " + client_access_token)
        request.add_header("User-Agent", "curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)") #Must include user agent of some sort, otherwise 403 returned
        while True:
            try:
                response = urllib.request.urlopen(request, timeout=4) #timeout set to 4 seconds; automatically retries if times out
                raw = response.read()
                #print(raw)
            except socket.timeout:
                print("Timeout raised and caught")
                continue
            break
        json_obj = json.loads(raw.decode('utf-8'))
        if json_obj["message"]["body"] != "":
            print(json_obj)
            body = json_obj["message"]["body"]["lyrics"]["lyrics_body"]
            copyright = json_obj["message"]["body"]["lyrics"]["lyrics_copyright"]
            tracking_url = json_obj["message"]["body"]["lyrics"]["html_tracking_url"]
            if(tracking_url!= ""):
                #print(body)
                #print(tracking_url)
                lyrics_tracking(tracking_url)
                return (body + "\n\n" +copyright)
            else:
                return "None"
        else:
            return "None"

def lyrics_tracking(tracking_url):
    while True:
        querystring = tracking_url
        request = urllib.request.Request(querystring)
        #request.add_header("Authorization", "Bearer " + client_access_token)
        request.add_header("User-Agent", "curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)") #Must include user agent of some sort, otherwise 403 returned
        try:
            response = urllib.request.urlopen(request, timeout=4) #timeout set to 4 seconds; automatically retries if times out
            raw = response.read()
        except socket.timeout:
            print("Timeout raised and caught")
            continue
        break
        print(raw)
if json_obj["message"]["body"] != "" and json_obj["message"]["body"] != []:
>>> json_obj = {'message': {'header': {'status_code': 401, 'execute_time': 0.00022006034851074}, 'body': ''}}
>>> json_obj['message']['body']
''
>>> json_obj['message']['body'] not in ('', [])
False
>>> json_obj['message']['body'] in ('', [])
True