在python中抓取页面时保留非拉丁字符

在python中抓取页面时保留非拉丁字符,python,encoding,python-unicode,non-latin,Python,Encoding,Python Unicode,Non Latin,我有一个程序,可以抓取一个页面,解析其中的任何链接,然后下载链接到的页面(听起来像爬虫,但不是),并将每个页面保存在一个单独的文件中。用于保存的文件名是页面url的一部分。例如,如果我找到一个指向www.foobar.com/foo的链接,我会下载该页面并将其保存在一个名为foo.xml的文件中 稍后,我需要遍历所有这些文件并重新下载它们,使用文件名作为url的最后一部分。(所有页面均来自单个站点。) 它工作得很好,直到我在url中遇到一个非拉丁字符。该网站使用utf-8,所以当我下载原始页面并

我有一个程序,可以抓取一个页面,解析其中的任何链接,然后下载链接到的页面(听起来像爬虫,但不是),并将每个页面保存在一个单独的文件中。用于保存的文件名是页面url的一部分。例如,如果我找到一个指向www.foobar.com/foo的链接,我会下载该页面并将其保存在一个名为foo.xml的文件中

稍后,我需要遍历所有这些文件并重新下载它们,使用文件名作为url的最后一部分。(所有页面均来自单个站点。)

它工作得很好,直到我在url中遇到一个非拉丁字符。该网站使用utf-8,所以当我下载原始页面并对其进行解码时,它工作正常。但是当我尝试使用解码后的url下载相应的页面时,它不起作用,因为我认为编码是错误的。我尝试在文件名上使用.encode()将其更改回原来的文件名,但没有任何更改

我知道这一定很简单,这是因为我没有正确理解编码问题,但我已经绞尽脑汁很久了。我已经读了乔尔·斯波尔斯基的《编码入门》好几遍了,但我仍然不太明白在这里该做什么。有人能帮我吗

非常感谢, bsg

这里有一些代码。我没有得到任何错误;但是,当我尝试使用页面名作为url的一部分下载页面时,我被告知该页面不存在。当然没有-没有像abc/x54这样的页面

澄清一下:我下载了一个页面的html,其中包括一个链接,例如www.foobar.com/Mehmet-Kenan-Dalbaşar,但它显示为Mehmet-u-Kenan-Dalba%C5%9Far。当我试图下载www.foobar.com/Mehmet_Kenan_Dalba%C5%9Far页面时,页面是空白的。我如何保存www.foobar.com/Mehmet-Kenan-Dalbaş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()
正如您所说,您可以使用而不是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获取内容。

如果您有一个包含代码“%C5”的url,并且希望使用实际字符\xC5获取该url,请调用
urllib.unquote()
在url上。

您能否发布相关代码以及在尝试下载文件时出现的错误?您构建的url与实际url有何区别?您可以发布这两个的
repr()
吗?实际url包含实际的非拉丁字符,呈现为。构造的url仅包含其代码(此处为%C5%9)。我想要真实的角色。repr()显示了代码。要从“%C5%9F”(6个字符)转到“\xC5\x9F”(2个字符),您需要
urllib.unquote()
。对不起-我应该将unquote()放在哪里,这会有什么帮助?再次感谢-它确实帮助解决了我的问题。我很抱歉有人读到这个问题,它是如此的不清楚-我不知道有人会知道为什么这是答案,但这是我最终要寻找的,它起了作用。