2010-04-30 4 views
1

Pour pratiquer encore quelques morceaux de python que j'ai eu un aller aux défis pythonchallenge.comchaîne à la fin de l'URL

En bref, ce défi en tant que première étape on a besoin de charger une page html d'une url avec un numéro à la fin. La page contient une seule ligne de texte qui contient un nombre. Ce numéro est utilisé pour remplacer celui existant dans l'url, et ainsi vous amène à la page suivante dans la séquence. Apparemment, cela continue pendant un certain temps ... (il y a plus à relever ce défi, mais faire fonctionner cette partie est la première étape).

Mon code pour le faire est ci-dessous (limité à parcourir ce que devraient être les quatre premières pages de la séquence, pour l'instant). Pour une raison quelconque, cela fonctionne la première fois - il obtient la deuxième page de la séquence, lit le numéro, passe au troisième et lit le numéro. Mais ensuite, il reste coincé sur le troisième. Je ne comprends pas pourquoi, mais pense que cela pourrait être quelque chose à voir avec ma tentative de transformer le nombre en une chaîne avant de le mettre à la fin de l'URL. Pour répondre à la question évidente, oui, je sais que pythonchallenge fonctionne OK - vous pouvez faire la chose url numéros manuellement aussi longtemps que vous avez la patience, pour confirmer, si vous le souhaitez: 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) 

Et la la sortie de ce qui précède est la suivante, ci-dessous. Il semble fonctionner correctement lors de la première exécution (en ajoutant le 92512 à l'url et en obtenant la page suivante avec succès et en trouvant la valeur suivante), mais après cela, il reste bloqué et ne semble pas charger la page suivante dans la séquence . Tester en changeant l'url manuellement dans un navigateur confirme que le numéro est correct et que pythonchallenge fonctionne correctement.

Il me semble que quelque chose ne va pas tourner ma recherche regex dans une chaîne à ajouter sur la fin de l'URL - mais pourquoi cela devrait fonctionner la première fois et pas la seconde je ne sais pas. J'étais également inquiet de ce que mes requêtes n'allaient pas plus loin qu'un cache (je suis nouveau sur httplib2 et je ne suis pas sûr de la façon dont ça se passe en cache) mais ils ne semblent pas l'être. J'ai également ajouté un argument de non-cache à la demande juste pour être sûr (pas montré dans ce code) mais cela n'a pas aidé.

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

('cache?', False)

et rien à côté est 92512

[ '92512']

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

('mis en cache?', Faux)

et rien à côté est 72758

[ '72758']

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

('cache?', False)

et rien à côté est 72758

['72758']

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

('mis en cache?», Faux)

et rien à côté est 72758

[ « 72758 »]

Je vous serais reconnaissant à tous ceux qui peuvent montrer où je me trompe, ainsi que pour des conseils pertinents

de Merci à l'avance ...

Répondre

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

Le problème est ici je pense. findall() retourner une liste:

re.findall (motif, string [, drapeaux])

Retour tous les matchs ne se chevauchent pas de motif dans la chaîne, comme une liste de chaînes. La chaîne est numérisée de gauche à droite et les correspondances sont renvoyées dans l'ordre trouvé. Si un ou plusieurs groupes sont présents dans le modèle, renvoyez une liste de groupes; ce sera une liste de tuples si le motif a plus d'un groupe. Les résultats vides sont inclus dans le résultat sauf s'ils touchent le début d'un autre match.

- doc Python

+0

Ah bien sûr, merci. J'ai tout oublié d'utiliser search et group() pour faire face à la place. – Tom

Questions connexes