1

python をもう少し練習するために、pythonchallenge.com の課題に取り組んでいます。

手短に言えば、最初のステップとしてのこの課題では、末尾に数字がある URL から html ページをロードする必要があります。このページには、数字を含む 1 行のテキストが含まれています。その番号は、URL 内の既存の番号を置き換えるために使用されるため、シーケンスの次のページに移動します。どうやらこれはしばらく続くようです... (この課題にはまだ続きがありますが、その部分を機能させることが最初のステップです)。

これを行うための私のコードは以下のとおりです (当面の間、シーケンスの最初の 4 ページを実行することに限定されます)。なんらかの理由で、最初は機能します。シーケンスの 2 番目のページを取得し、番号を読み取り、3 番目に進み、そこで番号を読み取ります。しかし、それは 3 番目でスタックします。理由はわかりませんが、URL の最後に数字を付ける前に数字を文字列に変換しようとしたことが関係しているのではないかと思います。明白な質問に答えるために、はい、私は pythonchallenge が正常に動作していることを知っています - あなたが好きなら、確認するために、忍耐があれば手動で url-numbers を行うことができます: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)

上記の出力は次のとおりです。最初の実行 (URL に 92512 を追加し、次のページを正常に取得して次の値を見つける) では問題なく動作するように見えますが、その後はスタックし、シーケンス内の次のページをロードしないようです。 . ブラウザで URL を手動で変更してテストすると、番号が正しく、pythonchallenge が正常に動作することが確認されます。

正規表現検索を文字列に変換して URL の末尾に追加するという問題が発生しているように見えますが、2 回目ではなく 1 回目で機能する理由はわかりません。また、リクエストがキャッシュまでしか届かないのではないかと心配していましたが(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']

私が間違っている場所を指摘できる人や、関連するヒントを教えてくれる人に感謝します

前もって感謝します...

4

1 に答える 1

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

問題はここにあると思います。findall()リストを返す:

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

文字列のリストとして、文字列内のパターンの重複しない一致をすべて返します。文字列は左から右にスキャンされ、一致するものが見つかった順序で返されます。パターンに1つ以上のグループが存在する場合は、グループのリストを返します。パターンに複数のグループがある場合、これはタプルのリストになります。空の試合は、別の試合の開始に触れない限り、結果に含まれます。

--Pythonドキュメント

于 2010-04-30T17:06:20.767 に答える