Сохраняйте нелатинские символы при очистке страницы в python

У меня есть программа, которая очищает страницу, анализирует ее на наличие ссылок, затем загружает страницы, на которые есть ссылки (звучит как поисковый робот, но это не так) и сохраняет каждую в отдельном файле. Имя файла, используемого для сохранения, является частью URL-адреса страницы. Так, например, если я найду ссылку на www.foobar.com/foo, я загружу страницу и сохраню ее в файле с именем foo.xml.

Позже мне нужно просмотреть все такие файлы и повторно загрузить их, используя имя файла в качестве последней части URL-адреса. (Все страницы взяты с одного сайта.)

Это работает хорошо, пока я не сталкиваюсь с нелатинским символом в URL-адресе. На сайте используется utf-8, поэтому, когда я загружаю исходную страницу и расшифровываю ее, все работает нормально. Но когда я пытаюсь использовать декодированный URL-адрес для загрузки соответствующей страницы, это не работает, потому что я предполагаю, что кодировка неверна. Я пытался использовать .encode() для имени файла, чтобы изменить его обратно, но это ничего не меняет.

Я знаю, что это должно быть очень просто и является результатом моего непонимания проблем с кодированием, но я долго ломал над этим голову. Я несколько раз читал введение Джоэла Спольски в кодирование, но до сих пор не могу понять, что здесь делать. Может кто-нибудь помочь мне?

Большое спасибо, бсг

Вот код. Я не получаю никаких ошибок; но когда я пытаюсь загрузить страницу, используя имя страницы как часть 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()

person bsg    schedule 19.12.2012    source источник
comment
Можете ли вы опубликовать соответствующий код и какие ошибки вы получаете при попытке загрузить файлы?   -  person Blender    schedule 20.12.2012
comment
Чем ваш сконструированный URL отличается от фактического? Можете ли вы опубликовать repr() обоих?   -  person Blender    schedule 20.12.2012
comment
Фактический URL-адрес содержит реальный нелатинский символ, отображаемый. Созданный URL-адрес содержит только его код (здесь %C5%9). Я хочу реального персонажа. repr() показывает код.   -  person bsg    schedule 20.12.2012
comment
Чтобы перейти от '%C5%9F' (6 символов) к '\xC5\x9F' (2 символа), вам нужно urllib.unquote().   -  person Armin Rigo    schedule 20.12.2012
comment
Извините, куда бы я поместил unquote() и как бы это помогло?   -  person bsg    schedule 20.12.2012
comment
Кроме того, я видел еще один вопрос SO, предлагающий использовать запросы. Это поможет?   -  person bsg    schedule 20.12.2012
comment
@bsg: я просто отвечаю на ваш предыдущий комментарий. Если у вас есть URL-адрес с кодом '%C5' и вам нужен фактический символ \xC5, вызовите urllib.unquote().   -  person Armin Rigo    schedule 22.12.2012
comment
@ArminRigo, твой комментарий решил мою проблему. Я хотел бы принять ваш ответ как правильный, но вы не опубликовали фактический ответ. Если вы опубликуете этот комментарий о unquote() в качестве ответа, я с радостью заменю принятый ответ на ваш. Большое спасибо!   -  person bsg    schedule 24.12.2012


Ответы (2)


Если у вас есть URL-адрес, например. код «%C5» и хотите получить его с фактическим символом \xC5, затем вызовите urllib.unquote() в URL-адресе.

person Armin Rigo    schedule 12.01.2013
comment
Еще раз большое спасибо - это действительно помогло решить мою проблему. Я прошу прощения у всех, кто читает этот вопрос, что он был настолько неясным - я не уверен, что кто-нибудь узнает, почему это был ответ, но это было то, что я в конечном итоге искал, и это сработало. - person bsg; 13.01.2013

Как вы сказали, вы можете использовать запросы вместо 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.

person YCFlame    schedule 21.12.2012