2017-01-16 4 views
1

Я пытаюсь использовать сгенерированные URL, как этот http://www.viaf.org/viaf/search?query=cql.any+=+%22Jean-Claude%20Moissinac%22&maximumRecords=5&httpAccept=application/jsonкодирующая URL с питоном 3

, но при его использовании с

# -*- encoding: utf-8 -*- 
 
import urllib.request 
 
# successful trial with the URI 
 
urlQuery = u'http://www.viaf.org/viaf/search?query=cql.any%20=%20"Bacache%20Maya"&httpAccept=application%2Fjson&maximumRecords=5' 
 
print(urlQuery) 
 
req = urllib.request.Request(urlQuery) 
 
with urllib.request.urlopen(req) as rep: 
 
    print("success") 
 

 
# attempt to build the URI; request fails 
 
viafBaseUrl = u"http://www.viaf.org" 
 
viafCommand = u"/viaf/search?" 
 
viafSearchTemplate = u'"__name%20__surname"' 
 
name = u"Bacache" 
 
surname = u"Maya" 
 
searchString = u'cql.any%20=%20' + viafSearchTemplate.replace(u"__surname", surname).replace(u"__name", name) 
 
params = u"query="+searchString+u"&httpAccept=application%2Fjson&maximumRecords=5" 
 
computedQuery = viafBaseUrl + viafCommand + params 
 
print(urlQuery) 
 
if computedQuery==urlQuery: 
 
    print("same strings") 
 
req = urllib.request.Request(computedQuery) 
 
with urllib.request.urlopen(req) as rep: 
 
    print("success")

Первый запрос является успешным, в то время как вторая ошибка с этой ошибкой:

UnicodeEncodeError: 'ascii' codec can't encode character '\ufeff' in position 76: ordinal not in range(128) 

Я пробовал много способов обойти проблему без успеха. Использование urllib.parse.urlencode() не работает, потому что оно изменяет некоторые символы, которые должны оставаться неповрежденными.

Результат печати на обоих URL идентичен, но строки разные, но я не понимаю, как получить одни и те же строки.

+0

Читать эту post..http: //stackoverflow.com/a/17912811/6107715 –

ответ

1

В строке application%2F есть скрытый символ юникода, между n и %. Просто удалите его, и он должен работать.

0

В своем втором заявлении на печать вы случайно ссылаетесь на первый запрос urlQuery вместо computedQuery. В вычисляемом запросе есть дополнительное пространство, которое становится очевидным после фиксации оператора печати.

Обновленный код ниже с исправлениями и пару комментариев:

# -*- encoding: utf-8 -*- 
 
import urllib.request 
 
# successful trial with the URI 
 
urlQuery = u'http://www.viaf.org/viaf/search?query=cql.any%20=%20"Bacache%20Maya"&httpAccept=application%2Fjson&maximumRecords=5' 
 
print(urlQuery) 
 
req = urllib.request.Request(urlQuery) 
 
with urllib.request.urlopen(req) as rep: 
 
    print("success") 
 

 
# attempt to build the URI; request fails 
 
viafBaseUrl = u"http://www.viaf.org" 
 
viafCommand = u"/viaf/search?" 
 
viafSearchTemplate = u'"__name%20__surname"' 
 
name = u"Bacache" 
 
surname = u"Maya" 
 
searchString = u'cql.any%20=%20' + viafSearchTemplate.replace(u"__surname", surname).replace(u"__name", name) 
 
params = u"query="+searchString+u"&httpAccept=application%2Fjson&maximumRecords=5" # space after application deleted 
 
computedQuery = viafBaseUrl + viafCommand + params 
 
print(computedQuery) # was urlQuery 
 
if computedQuery==urlQuery: 
 
    print("same strings") 
 
req = urllib.request.Request(computedQuery) 
 
with urllib.request.urlopen(req) as rep: 
 
    print("success")

 Смежные вопросы

  • Нет связанных вопросов^_^