3

ページをスクレイプし、リンクを解析してから、リンクされているページをダウンロードし(クローラーのように聞こえますが、そうではありません)、それぞれを個別のファイルに保存するプログラムがあります。保存に使用されるファイル名は、ページのURLの一部です。たとえば、www.foobar.com / fooへのリンクを見つけた場合は、ページをダウンロードしてfoo.xmlという名前のファイルに保存します。

後で、そのようなすべてのファイルをループして、URLの最後の部分としてファイル名を使用してそれらを再ダウンロードする必要があります。(すべてのページは単一のサイトからのものです。)

URLで非ラテン文字に遭遇するまではうまく機能します。このサイトはutf-8を使用しているため、元のページをダウンロードしてデコードすると、正常に機能します。しかし、デコードされたURLを使用して対応するページをダウンロードしようとすると、エンコードが間違っていると思われるため、機能しません。ファイル名に.encode()を使用して元に戻そうとしましたが、何も変更されません。

これは非常に単純で、エンコーディングの問題を正しく理解していない結果であるに違いないことはわかっていますが、私は長い間頭を悩ませてきました。Joel Spolskyのエンコーディングの紹介を何度か読んだことがありますが、それでもここで何をすべきかを完全に理解することはできません。誰か助けてもらえますか?

どうもありがとう、bsg

ここにいくつかのコードがあります。エラーは発生しません。しかし、URLの一部としてページ名を使用してページをダウンロードしようとすると、そのページが存在しないと言われます。もちろんそうではありません-abc/x54のようなページはありません。

明確にするために:たとえば、www.foobar.com / Mehmet KenanDalbaşarへのリンクを含むページのhtmlをダウンロードしますが、Mehmet_Kenan_Dalba%C5%9Farと表示されます。www.foobar.com/Mehmet_Kenan_Dalba%C5%9Farページをダウンロードしようとすると、ページが空白になります。www.foobar.com/Mehmet KenanDalbaşarを保持し、必要なときにサイトに戻すにはどうすればよいですか?

try:
    params = urllib.urlencode({'title': 'Foo', 'action': 'submit'})
    req = urllib2.Request(url='foobar.com',data=params, headers=headers)
    f = urllib2.urlopen(req)

    encoding = f.headers.getparam('charset')

    temp = f.read() .decode(encoding)

    #lots of code to parse out the links

    for line in links:
    try:
        pagename = line
        pagename = pagename.replace('\n', '')
        print pagename

        newpagename = pagename.replace(':', '_')
        newpagename = newpagename.replace('/', '_')
        final = os.path.join(fullpath, newpagename)
        print final
        final = final.encode('utf-8')
        print final

         ##only download the page if it hasn't already been downloaded
        if not os.path.exists(final + ".xml"):
                print "doesn't exist"
                save = open(final + ".xml", 'w')
                save.write(f.read())
                save.close()
4

2 に答える 2

1

あなたが言ったように、urllibの代わりにリクエストを使用することができます。

たとえば、URL「www.foobar.com/Mehmet_Kenan_Dalba%C5%9Far」を取得し、それを次のように引数としてリクエストに渡すとします。

import requests
r=requests.get("www.foobar.com/Mehmet_Kenan_Dalba%C5%9Far")

これで、r.textを使用してコンテンツを取得できます。

于 2012-12-21T03:41:58.113 に答える
0

たとえばコード'%C5'のURLがあり、実際の文字\ xC5で取得したい場合は、urllib.unquote()そのURLを呼び出します。

于 2013-01-12T10:05:50.113 に答える