Frage

Diese Frage hat hier bereits eine Antwort:

Ich muss eine URL analysieren. Ich verwende derzeit urlparse.urlparse () und urlparse.urlsplit ().

Das Problem ist, dass ich den "Netloc" (Host) nicht aus der URL bekommen kann, wenn es das Schema nicht präsentiert. Ich meine, wenn ich die folgende URL habe:

www.amazon.com/programming-python-mark-lutz/dp/0596158106/ref=sr_1_1?ie=utf8&qid=1308060974&sr=8-1

Ich kann den Netloc nicht bekommen: www.amazon.com

Nach Python -Dokumenten:

Nach den Syntax -Spezifikationen in RFC 1808 erkennt UrlParse nur ein Netloc, wenn er ordnungsgemäß durch '//' eingeführt wird. Andernfalls wird angenommen, dass der Eingang eine relative URL ist und somit mit einer Pfadkomponente beginnt.

Es ist also absichtlich so. Aber ich weiß immer noch nicht, wie ich Netloc von dieser URL bekomme.

Ich denke, ich könnte überprüfen, ob das Schema vorhanden ist und ob dies nicht der Fall ist, dann fügen Sie es hinzu und analysieren Sie es. Aber diese Lösung scheint nicht wirklich gut zu sein.

Hast du eine bessere Idee?

BEARBEITEN:Danke für alle Antworten. Aber ich kann das "Startswith" -Ding, das Corey und andere vorgeschlagen hat, nicht tun. Beecouse, wenn ich eine URL mit einem anderen Protokoll/Schema bekomme, würde ich es vermasseln. Sehen:

Wenn ich diese URL bekomme:

ftp://something.com

Mit dem vorgeschlagenen Code würde ich dem Start "http: //" hinzufügen und es vermasseln.

Die Lösung, die ich gefunden habe

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

Etwas zu beachten:

Ich mache zuerst eine Validierung, und wenn kein Schema gegeben wird, halte ich es für http: //

War es hilfreich?

Lösung

Die Dokumentation hat genau dieses Beispiel direkt unter dem von Ihnen eingefügten Text. Hinzufügen von '//', wenn es nicht ist, wird es bekommen, was Sie wollen. Wenn Sie nicht wissen, ob es das Protokoll und '//' gibt, können Sie einen Regex verwenden (oder sogar feststellen, ob es bereits enthält // '), um festzustellen, ob Sie es hinzufügen müssen oder nicht.

Ihre andere Option wäre die Verwendung von Split ('/') und das erste Element der Liste, das sie zurückgibt, was nur dann funktioniert, wenn die URL kein Protokoll oder '//' hat.

Bearbeiten (Hinzufügen für zukünftige Leser): Eine Regex zum Erkennen des Protokolls wäre so etwas wie re.match('(?:http|ftp|https)://', url)

Andere Tipps

Sieht so aus, als müssten Sie das Protokoll angeben, um Netloc zu erhalten.

Hinzufügen, wenn es nicht vorhanden ist, könnte wie folgt aussehen:

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

Aus den Dokumenten:

Nach den Syntax -Spezifikationen in RFC 1808 erkennt UrlParse nur ein Netloc, wenn er ordnungsgemäß durch '//' eingeführt wird. Andernfalls wird angenommen, dass der Eingang eine relative URL ist und somit mit einer Pfadkomponente beginnt.

So können Sie einfach:

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'

Wenn das Protokoll ist Immer http Sie können nur eine Zeile verwenden:

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

Eine bessere Option ist zu Verwenden Sie das Protokoll, wenn es bestanden wird:

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

Haben Sie darüber nachgedacht, nur nach dem Beginn der URL nach "http: //" zu überprüfen, und fügen Sie es hinzu, wenn es nicht da ist? Eine andere Lösung unter der Annahme, dass der erste Teil wirklich der Netloc und nicht Teil einer relativen URL ist, besteht darin, alles bis zum ersten "/" zu ergreifen und dies als Netloc zu verwenden.

Dieser eine Liner würde es tun.

netloc = urlparse('//' + ''.join(urlparse(url)[1:])).netloc
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top