1

キリル文字を含む URL をロードする必要があります。私のスクリプトはこれで動作するはずです:

http://wincode.org/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0 %BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/

これをブラウザで使用すると、通常のシンボルに置き換えられますが、urllib コードは 404 エラーで失敗します。この URL を正しくデコードするには?


アドレス = 'そのアドレス' のように、その URL をコードで直接使用している場合、完璧に機能します。しかし、この URL を取得するために解析ページを使用しました。キリル文字を含む URL のリストがあります。エンコーディングが正しくない可能性がありますか?より多くのコードは次のとおりです。

requestData = urllib2.Request( %SOME_ADDRESS%, None,  {"User-Agent": user_agent})
requestHandler = pageHandler.open(requestData)

pageData = requestHandler.read().decode('utf-8')
soupHandler = BeautifulSoup(pageData)

topicLinks = []
for postBlock in soupHandler.findAll('a', href=re.compile('%SOME_REGEXP%')):
    topicLinks.append(postBlock['href'])

postAddress = choice(topicLinks)

postRequestData = urllib2.Request(postAddress, None,  {"User-Agent": user_agent})
postHandler = pageHandler.open(postRequestData)
postData = postHandler.read()

  File "/usr/lib/python2.6/urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
4

2 に答える 2

5

キリル文字を含む URL のリストがあります。

OK、例とは異なる生の (% エンコードされていない) キリル文字が含まれている場合、実際には URL ではありません。

非 ASCII 文字を含むアドレスはIRIと呼ばれます。HTML リンクで IRI を使用するべきではありませんが、ブラウザーはこれらの誤りを修正する傾向があります。

IRI を で開くことができる URI に変換するには、次の手順を実行する必要がありますurllib

  1. Punycode (IDNA) を使用して、ホスト名部分の非 ASCII 文字をエンコードします。

  2. IRI の残りの非 ASCII 文字を UTF-8 バイトにエンコードし、それらを URL エンコードします ( %D0%BF...URL の例のようになります)。

実装例

于 2010-05-14T17:35:10.070 に答える
1

urllib.unquote メソッドの使用を試みることができます。

>>> import urllib
>>> string = urllib.unquote("http://wincode.org/%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5/")
>>> print string.decode("utf-8")
http://wincode.org/программирование/
于 2010-05-14T15:38:57.773 に答える