Как я могу придумать протокол «http: //» к URL, когда это необходимо? [дублировать
-
27-10-2019 - |
Вопрос
Этот вопрос уже имеет ответ здесь:
Мне нужно проанализировать URL. В настоящее время я использую urlparse.urlparse () и urlparse.urlsplit ().
Проблема в том, что я не могу получить «netloc» (хост) от URL, когда она не присутствует в схеме. Я имею в виду, если у меня есть следующий URL:
www.amazon.com/programming-python-mark-lutz/dp/0596158106/ref=sr_1_1?ie=utf8&qid=1308060974&sr=8-1
Я не могу получить netloc: www.amazon.com
Согласно документам Python:
Следуя синтаксическим спецификациям в RFC 1808, Urlparse распознает NetLoc, только если он должным образом введен «//». В противном случае предполагается, что вход является относительным URL и, таким образом, начинается с компонента пути.
Итак, это нарочно. Но я до сих пор не знаю, как получить Netloc из этого URL.
Я думаю, что я мог бы проверить, присутствует ли схема, а если это не так, добавьте ее, а затем проанализируйте ее. Но это решение не кажется действительно хорошим.
У вас есть лучшая идея?
РЕДАКТИРОВАТЬ:Спасибо за ответы на все вопросы. Но я не могу сделать «Startswith», которая предложена Кори и другими. Потому что, если я получу URL с другим протоколом/схемой, я бы испортил его. Видеть:
Если я получу этот URL:
ftp://something.com
С предложенным кодом я добавлю «http: //» к началу и испорчу его.
Решение, которое я нашел
if not urlparse.urlparse(url).scheme:
url = "http://"+url
return urlparse.urlparse(url)
Что -то следует отметить:
Сначала я делаю некоторую проверку, и если схема не дана схемы, я считаю ее http: //
Решение
В документации есть этот точный пример, чуть ниже текста, который вы вставли. Добавление '//', если этого нет, получит то, что вы хотите. Если вы не знаете, будет ли он иметь протокол и '//', вы можете использовать регуляцию (или даже просто посмотреть, содержит ли он уже '//'), чтобы определить, нужно ли вам добавить.
Другой вариант - использовать Split ('/') и взять первый элемент списка, который он возвращает, который будет работать только тогда, когда URL не имеет протокола или '//'.
Редактировать (добавление для будущих читателей): корпорация для обнаружения протокола будет чем -то вроде re.match('(?:http|ftp|https)://', url)
Другие советы
Похоже, вам нужно указать протокол, чтобы получить NetLoc.
Добавление его, если его нет, может выглядеть так:
import urlparse
url = 'www.amazon.com/Programming-Python-Mark-Lutz'
if '//' not in url:
url = '%s%s' % ('http://', url)
p = urlparse.urlparse(url)
print p.netloc
От документов:
Следуя синтаксическим спецификациям в RFC 1808, Urlparse распознает NetLoc, только если он должным образом введен «//». В противном случае предполагается, что вход является относительным URL и, таким образом, начинается с компонента пути.
Итак, вы можете просто сделать:
In [1]: from urlparse import urlparse
In [2]: def get_netloc(u):
...: if not u.startswith('http'):
...: u = '//' + u
...: return urlparse(u).netloc
...:
In [3]: get_netloc('www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[3]: 'www.amazon.com'
In [4]: get_netloc('http://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[4]: 'www.amazon.com'
In [5]: get_netloc('https://www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1')
Out[5]: 'www.amazon.com'
Если протокол Всегда http Вы можете использовать только одну строку:
return "http://" + url.split("://")[-1]
Лучший вариант - Используйте протокол, если он пройдет:
return url if "://" in url else "http://" + url
Рассматривали ли вы просто проверить наличие «http: //» в начале URL и добавьте его, если его там нет? Другое решение, предполагая, что первая часть действительно - NetLoc, а не часть относительного URL, - это просто взять все до первого «/» и использовать его в качестве NetLoc.
Этот один лайнер сделает это.
netloc = urlparse('//' + ''.join(urlparse(url)[1:])).netloc