У меня взяли интервью для растущего стартапа. Один из вопросов касался кодировки URI.
W3.org говорит, что эти URI одинаковы. Я изменил ABC с B93. Я получил это
>>> url4 = "http://b93.com:80/~smith/home.html" >>> url5 = "http://b93.com/%7Esmith/home.html" >>> urllib.parse.quote(url4) 'http%3A//b93.com%3A80/~smith/home.html' >>> urllib.parse.quote(url5) 'http%3A//b93.com/%257Esmith/home.html'
Как сравнить закодированные строки, чтобы получить правильную информацию? Как выполнить дальнейшее тестирование?
Я также пробовал JS с encodeURIComponenet ()
var p1 = encodeURIComponent("http://b93.com:80/~smith/home.html"); var p2 = encodeURIComponent("http://b93.com/%7Esmith/home.html"); console.log(p1); console.log(p2);
Выход
http%3A%2F%2Fb93.com%3A80%2F~smith%2Fhome.html http%3A%2F%2Fb93.com%2F%257Esmith%2Fhome.html
РЕДАКТИРОВАТЬ РЕШЕНО
deceze предположил, чтоЯ нормализую свой URL Node.Js код
var normalizeUrl = require('normalize-url'); var n1 = normalizeUrl("http://b93.com:80/~smith/home.html"); var n2 = normalizeUrl("http://b93.com/%7Esmith/home.html"); console.log(n1); console.log(n2); var p1 = encodeURIComponent(n1); var p2 = encodeURIComponent(n2); console.log(p1); console.log(p2);
Работает нормально
http://b93.com/~smith/home.html http://b93.com/~smith/home.html http%3A%2F%2Fb93.com%2F~smith%2Fhome.html http%3A%2F%2Fb93.com%2F~smith%2Fhome.html
Один из способов сделать это - сначала убедиться, что вы будете сравнивать URL без кавычек (используя urllib.parse.unquote вместо urllib.parse.quote). Затем вы можете использовать urllib.parse.urlparse для извлечения основных частей URL-адреса и сравнения их.
urllib.parse.unquote
urllib.parse.quote
urllib.parse.urlparse
from urllib.parse import unquote, urlparse url4 = "http://b93.com:80/~smith/home.html" url4 = unquote(url4) url5 = "http://b93.com/%7Esmith/home.html" url5 = unquote(url5) u4 = urlparse(url4) u5 = urlparse(url5) if u4.scheme == u5.scheme and u4.hostname == u5.hostname and u4.path == u5.path: print('equal') else: print('different')
Чтобы быть действительно уверенным, вы также можете сравнить порт, используя scheme для определенияпорт при port is None.
scheme
port is None