Как я могу придумать протокол «http: //» к URL, когда это необходимо? [дублировать

StackOverflow https://stackoverflow.com/questions/6344993

Вопрос

Этот вопрос уже имеет ответ здесь:

Мне нужно проанализировать 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top