在URL末尾添加字符串

1 投票
1 回答
1583 浏览
提问于 2025-04-15 22:12

为了多练习一些Python,我开始尝试在pythonchallenge.com上的挑战。

简单来说,这个挑战的第一步是从一个网址加载一个以数字结尾的HTML页面。这个页面里有一行文字,里面包含一个数字。这个数字会替换掉网址中的现有数字,然后你就能进入下一个页面。听说这个过程会持续一段时间……(这个挑战还有更多内容,但先把这一部分搞定是第一步)。

我写的代码如下(目前只限于处理应该是前四个页面)。奇怪的是,它第一次运行时能正常工作——获取到第二个页面,读取数字,然后进入第三个页面,再读取那里的数字。但之后它在第三个页面就卡住了。我不明白为什么,不过我觉得可能和我试图把数字转换成字符串再加到网址末尾有关。回答一个显而易见的问题,是的,我知道pythonchallenge是正常工作的——如果你愿意,可以手动进行网址和数字的操作来确认,只要你有耐心:p

import httplib2
import re

counter = 0
new = '12345' #the number for the initial page in the sequence, as a string

while True:
    counter = counter + 1
    if counter == 5:
        break

    original = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
    nextpage = original+new     #each page in the sequence is visited by adding 
                                #the number after 'nothing='
    print(nextpage)

    h = httplib2.Http('.cache')
    response, content = h.request(nextpage, "GET")  #get the content of the page, 
                                                    #which includes the number for the 
                                                    #*next* page in the sequence

    p = re.compile(r'\d{4,5}$')     #regex to find a 4 to 5 digit number at the end of
                                    #the content

    new = str((p.findall(content)))     #make the regex result a string - is this
                                            #where the problem lies?

    print('cached?', response.fromcache)    #I was worried my requests were somehow
                                            #being cached not actually sent afresh to
                                            #pythonchallenge. But it seems they aren't.

    print(content)
    print(new)

以上代码的输出如下。第一次运行时似乎一切正常(把92512加到网址上,成功获取下一个页面并找到下一个值),但之后就卡住了,似乎无法加载下一个页面。通过在浏览器中手动更改网址进行测试,确认数字是正确的,pythonchallenge也正常工作。

我觉得可能是在把我的正则表达式搜索结果转换成字符串以添加到网址末尾时出了问题——但为什么第一次能成功而第二次不行,我就不知道了。我还担心我的请求可能只到达了缓存(我对httplib2不太熟悉,不太确定它是如何处理缓存的),但看起来并不是。我还在请求中添加了一个不缓存的参数以确保(在这段代码中没有显示),但也没有帮助。

http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345

('cached?', False)

下一个nothing是92512

['92512']

http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=['92512']

('cached?', False)

下一个nothing是72758

['72758']

http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=['72758']

('cached?', False)

下一个nothing是72758

['72758']

http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=['72758']

('cached?', False)

下一个nothing是72758

['72758']

如果有人能指出我哪里出错了,或者给我一些相关的建议,我将非常感激。

提前谢谢大家……

1 个回答

1
http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=['72758']
                                                             ^^     ^^

我觉得问题出在这里。findall() 返回的是一个列表:

re.findall(pattern, string[, flags])

这个函数会在给定的字符串中找到所有不重叠的模式匹配,并把它们作为一个字符串列表返回。它是从左到右扫描字符串的,找到的匹配项会按照找到的顺序返回。如果模式中有一个或多个分组,它会返回一个分组的列表;如果模式有多个分组,返回的将是一个元组的列表。空匹配也会包含在结果中,除非它们与另一个匹配的开头相接触。

-- Python 文档

撰写回答