2008-11-03 7 views
8

Ich arbeite mit einer riesigen Liste von URLs. Nur eine kurze Frage, die ich aus einem Teil der URL zu schneiden habe versucht, siehe unten:Slicing URL mit Python

http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3 

Wie kann ich in Scheiben schneiden out:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234 

Manchmal gibt es mehr als zwei Parameter nach der CONTENT_ITEM_ID und die ID ist jedes Mal anders, ich denke, dass es getan werden kann, indem man die erste & findet und dann die Zeichen vor dem & abschneidet, nicht ganz sicher, wie man dieses tho tut.

Prost

Antwort

14

Verwenden Sie das Modul urlparse. Aktivieren Sie diese Funktion:

import urlparse 

def process_url(url, keep_params=('CONTENT_ITEM_ID=',)): 
    parsed= urlparse.urlsplit(url) 
    filtered_query= '&'.join(
     qry_item 
     for qry_item in parsed.query.split('&') 
     if qry_item.startswith(keep_params)) 
    return urlparse.urlunsplit(parsed[:3] + (filtered_query,) + parsed[4:]) 

In Ihrem Beispiel:

>>> process_url(a) 
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234' 

Diese Funktion den zusätzlichen Bonus hat, dass es einfacher ist, zu verwenden, wenn Sie entscheiden, dass Sie auch einige weitere Abfrageparameter werden soll, oder wenn die Reihenfolge der die Parameter nicht festgelegt, wie in:

>>> url='http://www.domainname.com/page?other_value=xx&param3&CONTENT_ITEM_ID=1234&param1' 
>>> process_url(url, ('CONTENT_ITEM_ID', 'other_value')) 
'http://www.domainname.com/page?other_value=xx&CONTENT_ITEM_ID=1234' 
1

Habe ich es unten heraus ist, was ich tun musste:

url = "http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3" 
url = url[: url.find("&")] 
print url 
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234' 
+0

Achtung: Wenn keine Parameter (kein "&") vorhanden sind, wird nur das letzte Zeichen aus der URL gelöscht. –

+0

Siehe http://stackoverflow.com/questions/229352/python-find-question für eine bessere Lösung. –

+0

Ah ich sehe, wie das ein Problem sein könnte und danke für die Warnung. Die Liste, die ich verwende, hat immer einen Parameter, aber ich werde das für die Zukunft berücksichtigen. :) – RailsSon

0
import re 
url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3' 
m = re.search('(.*?)&', url) 
print m.group(1) 
4

Die schnelle und schmutzige Lösung ist dies:

>>> "http://something.com/page?CONTENT_ITEM_ID=1234&param3".split("&")[0] 
'http://something.com/page?CONTENT_ITEM_ID=1234' 
3

Eine andere Möglichkeit wäre, Verwenden Sie die Split-Funktion mit & als Parameter. Auf diese Weise würden Sie sowohl die Basis-URL als auch beide Parameter extrahieren.

url.split("&") 

gibt eine Liste mit

['http://www.domainname.com/page?CONTENT_ITEM_ID=1234', 'param2', 'param3'] 
0

Diese Methode hängt nicht von der Position des Parameters innerhalb der URL-Zeichenfolge ab. Dies könnte, ich bin sicher, verfeinert werden, aber es bringt den Punkt über.

url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3' 
parts = url.split('?') 
id = dict(i.split('=') for i in parts[1].split('&'))['CONTENT_ITEM_ID'] 
new_url = parts[0] + '?CONTENT_ITEM_ID=' + id 
1

Parsin URL ist nie so einfach ich es scheint, deshalb gibt es die Module urlparse und urllib.

Beispiel:

import urllib 
url ="http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3" 
query = urllib.splitquery(url) 
result = "?".join((query[0], query[1].split("&")[0])) 
print result 
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234' 

Dies ist noch nicht 100% zuverlässig, aber viel mehr, als es sich spalten, denn es gibt viele gültige URL-Format, die Sie und mich nicht kennen, und eines Tages entdecken in Fehlerprotokolle.

0

eine alte Frage, aber immer noch, würde Ich mag, dass die Query-String-paramenters zu bemerken, kann auch durch getrennt werden ‚;‘ nicht nur '&'.

0

neben urlparse gibt es auch furl, die IMHO besser API hat.