3

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

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

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

我知道这一定很简单,并且是我没有正确理解编码问题的结果,但我已经为此苦苦挣扎了很长时间。我已经多次阅读 Joel Spolsky 对编码的介绍,但我仍然无法完全确定在这里做什么。谁能帮我?

非常感谢,bsg

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

澄清一下:我下载了一个页面的 html,其中包含指向 www.foobar.com/Mehmet Kenan Dalbaşar 的链接,例如,但它显示为 Mehmet_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()
4

2 回答 2

1

正如您所说,您可以使用请求而不是 urllib。

假设您获得了网址“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 回答