Comment puis-je préfixer le « http: // » protocole à une URL si nécessaire? [dupliquer]

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

Question

Cette question a déjà une réponse ici:

Je dois analyser une URL. J'utilise actuellement urlparse.urlparse () et urlparse.urlsplit ().

Le problème est que je ne peux pas obtenir le « Netloc » (hôte) à partir de l'URL quand il est pas présent régime. Je veux dire, si j'ai l'adresse suivante:

www.amazon.com/Programming-Python-Mark-Lutz/dp/0596158106/ref=sr_1_1?ie=UTF8&qid=1308060974&sr=8-1

Je ne peux pas obtenir le Netloc: www.amazon.com

Selon docs python:

En suivant les spécifications de syntaxe RFC 1808, urlparse reconnaît un Netloc que si elle est correctement introduite par « // ». Sinon, l'entrée est présumée être une URL relative et donc commencer avec un composant de chemin d'accès.

Alors, il est ainsi le but. Mais, je ne sais toujours pas comment obtenir le Netloc de cette URL.

Je pense que je pourrais vérifier si le régime est présent, et si ce n'est pas, puis ajoutez, puis l'analyser. Mais cette solution ne semble vraiment bon.

Avez-vous une meilleure idée?

EDIT: Merci pour toutes les réponses. Mais, je ne peux pas faire la chose « de startswith » qui est proposé par Corey et d'autres. Becouse, si je reçois une URL avec un autre protocole / système i serait gâcher. Voir:

Si je reçois l'adresse suivante:

ftp://something.com

Avec le code proposé j'ajouter « http: // ». Au début et serait gâcher

La solution que j'ai trouvé

if not urlparse.urlparse(url).scheme:
   url = "http://"+url
return urlparse.urlparse(url)

Quelque chose à noter:

Je fais une validation d'abord, et si aucun régime, je considère qu'il est donné d'être http: //

Était-ce utile?

La solution

La documentation a cet exemple précis, juste en dessous du texte collé. Ajout « // » si ce n'est pas, il y aura ce que vous voulez. Si vous ne savez pas si cela va avoir le protocole et « // » vous pouvez utiliser une expression régulière (ou même simplement voir si elle contient déjà « // ») afin de déterminer si vous devez ou non pour l'ajouter.

Votre autre option serait d'utiliser split ( « / ») et de prendre le premier élément de la liste retourne, qui ne fonctionne que si l'URL n'a pas de protocole ou « //'.

EDIT (ajout pour les futurs lecteurs): une expression régulière pour détecter le protocole serait quelque chose comme re.match('(?:http|ftp|https)://', url)

Autres conseils

Il semble que vous devez spécifier le protocole pour obtenir Netloc.

ajouter si ce n'est pas présent look pourrait comme ceci:

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

A partir de la documentation:

En suivant les spécifications de syntaxe dans la RFC 1808, urlparse reconnaît un Netloc que si elle est correctement introduite par « // ». Sinon, l'entrée est présumée être une URL relative et donc de commencer par un composant de chemin.

Vous pouvez simplement faire:

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'

Si le protocole est toujours http vous pouvez utiliser une seule ligne:

return "http://" + url.split("://")[-1]

Une meilleure option consiste à utiliser le protocole s'il est passé :

return url if "://" in url else "http://" + url

Avez-vous envisagé simplement vérifier la présence de « http: // » au début de l'URL, et l'ajouter si ce n'est pas là? Une autre solution, en supposant que la première partie est vraiment la Netloc et ne fait pas partie d'une url relative, est juste tout grab jusqu'au premier « / » et l'utiliser comme Netloc.

Celui-liner le ferait.

netloc = urlparse('//' + ''.join(urlparse(url)[1:])).netloc
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top