在Python中刮擦页面时,请保留非拉丁字符



我有一个程序刮擦页面,对任何链接进行解析,然后下载链接到(听起来像crawler,但不是)的页面,并将每个页面保存在单独的文件中。用于保存的文件名是页面URL的一部分。因此,例如,如果我找到了www.foobar.com/foo的链接,我将下载页面并将其保存在标题为foo.xml的文件中。

稍后,我需要循环浏览所有此类文件,并使用文件名作为URL的最后一部分重新下载。(所有页面均来自一个站点。)

它运行良好,直到我在URL中遇到非拉丁语字符。该站点使用UTF-8,因此当我下载原始页面并解码它时,它可以正常工作。但是,当我尝试使用解码的URL下载相应的页面时,它行不通,因为我认为编码是错误的。我已经尝试在文件名上使用.encode()将其重新更改,但没有更改任何内容。

我知道这一定很简单,并且由于我不正确理解编码问题的结果,但是很长一段时间以来,我一直在努力。我已经读过乔尔·斯波尔斯基(Joel Spolsky)的介绍几次编码,但我仍然无法完全弄清楚在这里该怎么做。谁能帮我吗?

非常感谢, BSG

这是一些代码。我没有任何错误;但是,当我尝试使用Pagename作为URL的一部分下载页面时,我被告知该页面不存在。当然不是 - 没有ABC/x54的页面。

要澄清:我下载了一个页面的HTML,其中包含指向www.foobar.com/mehmet kenandalbaşar的链接,例如,但它显示为mehmet_kenan_dalba%C5%9far。当我尝试下载页面www.foobar.com/mehmet_kenan_dalbaşar时,页面为空白。如何保留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()

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

假设您获取URL" www.foobar.com/mehmet_kenan_dalbaşar",然后将其传递给请求作为参数,如下:

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

现在您可以使用r.text。

获得内容

如果您的URL具有例如代码"%c5",想用实际字符 xc5获得它,然后在URL上调用urllib.unquote()

相关内容

  • 没有找到相关文章