ページをスクレイプし、リンクを解析してから、リンクされているページをダウンロードし(クローラーのように聞こえますが、そうではありません)、それぞれを個別のファイルに保存するプログラムがあります。保存に使用されるファイル名は、ページの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()