Добавление строки в конец URL - PullRequest
1 голос
/ 30 апреля 2010

Чтобы попрактиковаться еще в Python, я решил попробовать себя на pythonchallenge.com

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

Мой код для этого приведен ниже (пока что он ограничен тем, что должно быть на первых четырех страницах последовательности). По какой-то причине он работает в первый раз - он получает вторую страницу последовательности, читает число, переходит к третьей и читает там число. Но затем он застревает на третьем. Я не понимаю почему, хотя думаю, что это может быть связано с моей попыткой превратить число в строку перед тем, как поместить его в конец URL. Чтобы ответить на очевидный вопрос, да, я знаю, что pythonchallenge работает нормально - вы можете делать URL-номера вручную, если у вас есть терпение, чтобы подтвердить, если вам нравится: 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 к 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']

('кэшировано?', 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']

('кэшировано?', False)

и следующее ничто - 72758

[ '72758']

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

Заранее спасибо ...

1 Ответ

1 голос
/ 30 апреля 2010
http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=['72758']
                                                             ^^     ^^

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

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

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

- Python doc

...