我有一个程序可以抓取页面,解析任何链接,然后下载链接到的页面(听起来像爬虫,但不是),并将每个页面保存在一个单独的文件中。用于保存的文件名是页面URL的一部分。例如,如果我找到www.foobar.com/foo的链接,我会下载页面并将其保存在名为foo.xml的文件中。
稍后,我需要遍历所有这些文件并重新下载它们,使用文件名作为URL的最后一部分。 (所有页面都来自一个站点。)
效果很好,直到我在网址中遇到非拉丁字符。该网站使用utf-8,所以当我下载原始页面并解码时,它工作正常。但是当我尝试使用解码的url下载相应的页面时,它不起作用,因为我认为编码是错误的。我尝试在文件名上使用.encode()将其更改回来,但它不会改变任何内容。
我知道这一定非常简单,而且我不能正确理解编码问题的结果,但我已经开始了很长时间。我已经多次阅读过Joel Spolsky对编码的介绍,但我还是不知道该怎么做。任何人都可以帮助我吗?
非常感谢, bsg
这是一些代码。我没有任何错误;但是当我尝试使用pagename作为url的一部分下载页面时,我被告知该页面不存在。当然它没有 - 没有像abc / x54这样的页面。
澄清:我下载了一个页面的html,其中包含指向www.foobar.com/MehmetKenanDalbaşar的链接,例如,但它显示为Mehmet_Kenan_Dalba%C5%9Far。当我尝试下载页面www.foobar.com/Mehmet_Kenan_Dalba%C5%9Far时,页面为空白。我如何保留www.foobar.com/MehmetKenanDalbaş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()
答案 0 :(得分:1)
正如您所说,您可以使用requests代替urllib。
假设您获取了网址“www.foobar.com/Mehmet_Kenan_Dalba%C5%9Far”,然后将其作为参数传递给请求,如下所示:
import requests
r=requests.get("www.foobar.com/Mehmet_Kenan_Dalba%C5%9Far")
现在您可以使用r.text获取内容。
答案 1 :(得分:0)
如果你有一个网址,例如代码'%C5'并希望使用实际字符\ xC5获取它,然后在网址上调用urllib.unquote()
。