3

私は現在Pythonの課題に取り組んでおり、レベル4に到達しています。ここを参照してください。Pythonを学習してから数か月しか経っていません。これまでのところ、2.xでPython3を学習しようとしています。このコードを使用する場合を除いて、Python2.xバージョンは次のとおりです。

import urllib, re
prefix = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
findnothing = re.compile(r"nothing is (\d+)").search
nothing = '12345'
while True:
    text = urllib.urlopen(prefix + nothing).read()
    print text
    match = findnothing(text)
    if match:
        nothing = match.group(1)
        print "   going to", nothing
    else:
        break

したがって、これを3に変換するには、次のように変更します。

import urllib.request, urllib.parse, urllib.error, re
prefix = "http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="
findnothing = re.compile(r"nothing is (\d+)").search
nothing = '12345'
while True:
    text = urllib.request.urlopen(prefix + nothing).read()
    print(text)
    match = findnothing(text)
    if match:
        nothing = match.group(1)
        print("   going to", nothing)
    else:
        break

したがって、2.xバージョンを実行すると、正常に動作し、ループを通過し、URLをスクレイピングして最後に移動すると、次の出力が得られます。

and the next nothing is 72198
   going to 72198
and the next nothing is 80992
   going to 80992
and the next nothing is 8880
   going to 8880 etc

3.xバージョンを実行すると、次の出力が得られます。

b'and the next nothing is 44827'
Traceback (most recent call last):
  File "C:\Python32\lvl4.py", line 26, in <module>
    match = findnothing(b"text")
TypeError: can't use a string pattern on a bytes-like object

したがって、この行でrをabに変更すると

findnothing = re.compile(b"nothing is (\d+)").search

私は得る:

b'and the next nothing is 44827'
   going to b'44827'
Traceback (most recent call last):
  File "C:\Python32\lvl4.py", line 24, in <module>
    text = urllib.request.urlopen(prefix + nothing).read()
TypeError: Can't convert 'bytes' object to str implicitly

何か案は?

私はプログラミングにかなり慣れていないので、頭を悩ませないでください。

_bk201

4

3 に答える 3

4

bytes と str オブジェクトを暗黙的に混在させることはできません。

最も簡単な方法は、返されたバイトをデコードしurlopen().read()、どこでも str オブジェクトを使用することです。

text = urllib.request.urlopen(prefix + nothing).read().decode() #note: utf-8

Content-Typeページは、ヘッダーまたは<meta>要素を介して適切な文字エンコーディングを指定していません。デフォルトのエンコーディングがどうあるべきかわかりませんtext/htmlが、rfc 2068 は次のように述べています。

明示的な文字セット パラメータが送信者によって提供されない場合、「テキスト」タイプのメディア サブタイプは、HTTP 経由で受信したときにデフォルトの文字セット値「ISO-8859-1」を持つように定義されます。

于 2012-02-26T13:03:47.343 に答える
1

正規表現は、バイナリ データではなく、テキストに対してのみ意味があります。したがって、 を保持findnothing = re.compile(r"nothing is (\d+)").searchし、代わりに文字列に変換textします。

于 2012-02-26T13:04:21.247 に答える