【问题标题】:String formatting - tuple index out of range字符串格式化 - 元组索引超出范围
【发布时间】:2015-07-30 16:10:15
【问题描述】:

我正在尝试将变量放入长字符串,但它会引发错误。我已经尝试过 %s 表示法,现在我正试图将.format() 表示法放在那里,但它也不起作用。

你能告诉我是什么问题吗?是因为字符串在多行上吗?

    num = 5
    r=requests.post("http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{0}'.html".format(str(num)), headers=mLib.firebug_headers_to_dict("""POST /kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{1}'.html HTTP/1.1
    Host: www.quoka.de
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{2}'.html
    Cookie: QSESSID=cs9djh8q8c6mjgsme85s4mf7iq24pqrthag630ar6po9fp078e20; PARTNER=VIEW%02quoka%01COOKIEBEGIN%021438270171; QUUHS=QPV%027%01QABAFS%02A%01ARYSEARCHODER%02%7B%22search1%22%3A%22nachhilfe%22%7D; __utma=195481459.415565446.1438270093.1438270093.1438270093.1; __utmb=195481459.22.8.1438270093; __utmc=195481459; __utmz=195481459.1438270093.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmt_t2=1; POPUPCHECK=1438356493224; axd=100086901728180087; __gads=ID=92bfc541911a1c81:T=1438270098:S=ALNI_MYuEdhQnu7sWAfK-fyKf1Ej93_9KA; crtg_rta=; OX_sd=5; OX_plg=wmp|pm; rsi_segs=L11278_10123|L11278_10571|L11278_11639|F12351_10001|F12351_0; PURESADSCL=done
    Connection: keep-alive
    """.format(str(num),str(num-1))))

错误:

 """.format(str(num),str(num-1))))
IndexError: tuple index out of range

【问题讨论】:

  • 那么,您希望在{2} 中得到什么?当您到达与 URL 字符串完全分开的多行字符串时,编号应该重新开始。

标签: python string formatting


【解决方案1】:

在第二个多行字符串中,您将索引为 - {1}{2} at -

_page_'{1}'.html

_0_page_'{2}'.html

但是您只提供了两个变量作为 format() 函数的参数。

这就是为什么当格式化函数试图访问{2} 的变量时(这是第三个参数,因为它的 0 索引)它会出错。

您应该将它们定义为{0}{1}

例子-

r=requests.post("http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{0}'.html".format(str(num)), headers=mLib.firebug_headers_to_dict("""POST /kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{0}'.html HTTP/1.1
    Host: www.quoka.de
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{1}'.html
    Cookie: QSESSID=cs9djh8q8c6mjgsme85s4mf7iq24pqrthag630ar6po9fp078e20; PARTNER=VIEW%02quoka%01COOKIEBEGIN%021438270171; QUUHS=QPV%027%01QABAFS%02A%01ARYSEARCHODER%02%7B%22search1%22%3A%22nachhilfe%22%7D; __utma=195481459.415565446.1438270093.1438270093.1438270093.1; __utmb=195481459.22.8.1438270093; __utmc=195481459; __utmz=195481459.1438270093.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmt_t2=1; POPUPCHECK=1438356493224; axd=100086901728180087; __gads=ID=92bfc541911a1c81:T=1438270098:S=ALNI_MYuEdhQnu7sWAfK-fyKf1Ej93_9KA; crtg_rta=; OX_sd=5; OX_plg=wmp|pm; rsi_segs=L11278_10123|L11278_10571|L11278_11639|F12351_10001|F12351_0; PURESADSCL=done
    Connection: keep-alive
    """.format(str(num),str(num-1))))

【讨论】:

    【解决方案2】:

    您的格式字符串从 1 开始编号,而不是 0。您只为插槽 0 和 1 提供 2 个值,但您的模板需要编号为 1 和 2 的参数。

    请注意,这里有 两个单独的字符串。第一个字符串使用{0},第二个使用{1}{2}。将它们重新编号为 {0}{1}

    重申一下,第一个字符串很好:

    "http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{0}'.html".format(str(num))
    

    但您必须重新开始第二个字符串中的编号。在那个字符串中你有

    POST /kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{1}'.html HTTP/1.1
    

    Referer: http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{2}'.html
    

    简单使用

    POST /kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{0}'.html HTTP/1.1
    

    Referer: http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_'{1}'.html
    

    请注意,那些'..' 单引号是您正在生成的字符串的一部分。我刚刚测试了该站点,并且那里的 URL 没有使用这些引号。您可能应该删除它们。您也不必在所有事情上都调用str(),模板会为您处理这些:

    num = 5
    r = requests.post(
        "http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_{0}.html".format(num),
        headers=mLib.firebug_headers_to_dict("""\
    POST /kleinanzeigen/nachhilfe/cat_0_ct_0_page_{0}.html HTTP/1.1
    Host: www.quoka.de
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Referer: http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_{1}.html
    Cookie: QSESSID=cs9djh8q8c6mjgsme85s4mf7iq24pqrthag630ar6po9fp078e20; PARTNER=VIEW%02quoka%01COOKIEBEGIN%021438270171; QUUHS=QPV%027%01QABAFS%02A%01ARYSEARCHODER%02%7B%22search1%22%3A%22nachhilfe%22%7D; __utma=195481459.415565446.1438270093.1438270093.1438270093.1; __utmb=195481459.22.8.1438270093; __utmc=195481459; __utmz=195481459.1438270093.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmt_t2=1; POPUPCHECK=1438356493224; axd=100086901728180087; __gads=ID=92bfc541911a1c81:T=1438270098:S=ALNI_MYuEdhQnu7sWAfK-fyKf1Ej93_9KA; crtg_rta=; OX_sd=5; OX_plg=wmp|pm; rsi_segs=L11278_10123|L11278_10571|L11278_11639|F12351_10001|F12351_0; PURESADSCL=done
    Connection: keep-alive
    """.format(num, num - 1)
        ))
    

    此外,我强烈怀疑您是否需要包含POST <path> HTTP/1.1line。 HostAccept-EncodingConnection 标头将由 requests 处理,如果您要使用 Session() 对象,cookie 也会如此。尽量不要明确设置所有这些标题。将标题设置为字典可能更具可读性:

    session = requests.Session()
    url = 'http://www.quoka.de/kleinanzeigen/nachhilfe/cat_0_ct_0_page_{0}.html'
    num = 5
    r = session.post(
        url.format(num),
        headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0',
            'Referer': url.format(num - 1),
        }
    )
    

    最后但同样重要的是,您确定需要在这里执行POST 吗?您没有发布任何内容,GET 也可以正常工作。

    【讨论】:

    • 不,我不是,有 2 个单独的文本。第一个 {0} 在第一个文本中,因此它在那里进行格式化。
    • @Milan:那是一个单独的字符串
    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多