2010-04-30 4 views
1

Практиковать еще несколько битов питона у меня были пойти на вызовы на pythonchallenge.comДобавление строки в конец URL

Короче говоря, эта задача в качестве первого шага требует, чтобы загрузить HTML-страницу от URL-адреса с номером в конце. Страница содержит одну строку текста, в которой есть число. Этот номер используется для замены существующего в URL-адресе, и поэтому перейдите на следующую страницу в последовательности. По-видимому, это продолжается в течение некоторого времени ... (это больше связано с этой задачей, но первая часть работы - это первый шаг).

Мой код для этого приведен ниже (ограничивается тем, какими должны быть первые четыре страницы в последовательности, пока). По какой-то причине он работает в первый раз - он получает вторую страницу в последовательности, читает номер, переходит в третью и читает номер там. Но тогда он застревает на третьем. Я не понимаю, почему, хотя думаю, что это может быть связано с моей попыткой превратить число в строку, прежде чем положить его в конец URL-адреса. Для того, чтобы ответить на очевидный вопрос, да, я знаю, что pythonchallenge работает нормально - вы можете сделать URL-номер вещи вручную до тех пор, пока у вас есть терпение, чтобы подтвердить, если вы хотите: р

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 к URL-адресу и успешное получение следующей страницы и поиск следующего значения), но после этого он просто застревает и, похоже, не загружает следующую страницу в последовательности , Тестирование путем изменения URL-адреса вручную в браузере подтверждает, что номер правильный, а pythonchallenge работает нормально.

Мне кажется, что что-то не так, превратив поиск регулярных выражений в строку, чтобы добавить в конец URL-адреса, но почему это должно срабатывать в первый раз, а не второе, чего я не знаю. Я также был обеспокоен, может быть, мои запросы доходили только до кеша (я новичок в httplib2 и не уверен в том, как это делает кеширование), но они, похоже, не так. Я также добавил аргумент no-cache для запроса, чтобы быть уверенным (не показано в этом коде), но это не помогло.

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

('кэшируются?', False)

и следующий ничего не 92512

[ '92512']

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

('cached?', False)

и следующий ничего не 72758

[ '72758']

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

('кэшируются?', False)

и следующий ничего не 72758

[ '72758']

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

('cached?», False)

и рядом нет ничего 72758

[ '72758']

Я был бы признателен всем, кто может указать, где я неправильно, а также любые соответствующие советы

Спасибо заранее ...

ответ

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

Проблема здесь, я думаю. findall() возвращает список:

re.findall (шаблон, строка [, флаги])

Вернитесь все непересекающиеся спичками паттерна в строке, в виде списка строк. Строка сканируется слева направо, а совпадения возвращаются в найденном порядке. Если одна или несколько групп присутствуют в шаблоне, верните список групп; это будет список кортежей, если шаблон имеет более одной группы. Пустые совпадения включаются в результат, если они не касаются начала другого матча.

- Python док

+0

Ах, конечно, спасибо. Я забыл все об использовании поиска и group(), чтобы справиться с этим. – Tom

Смежные вопросы