Чтобы получить относительный путь между путями, вы можете использовать метод relativize()
.
Таким образом, вы должны быть в состоянии сделать это, как только вы нашли базовый путь, который - если вы его еще не знаете - можно было бы сделать, перебирая родителей (используя getParent()
), пока вы не найдете его ( отметив getFilename()
) или попав в корень. Тогда это должно быть так же просто, как parentPath.relativize(path)
.
Используйте urlparse модуль. Проверьте эту функцию:
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:])
В Вашем примере:
>>> process_url(a)
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'
Эта функция имеет добавленную премию, которую легче использовать, если Вы решаете, что также хотите еще некоторые параметры запроса, или если порядок параметров не фиксируется, как в:
>>> url='http://www.domainname.com/page?other_value=xx¶m3&CONTENT_ITEM_ID=1234¶m1'
>>> process_url(url, ('CONTENT_ITEM_ID', 'other_value'))
'http://www.domainname.com/page?other_value=xx&CONTENT_ITEM_ID=1234'
Быстрое и грязное решение - это:
>>> "http://something.com/page?CONTENT_ITEM_ID=1234¶m3".split("&")[0]
'http://something.com/page?CONTENT_ITEM_ID=1234'
Другая опция состояла бы в том, чтобы использовать функцию разделения, с и в качестве параметра. Тем путем Вы извлекли бы и базовый URL и оба параметра.
url.split("&")
возвращает список с
['http://www.domainname.com/page?CONTENT_ITEM_ID=1234', 'param2', 'param3']
import re
url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234¶m2¶m3'
m = re.search('(.*?)&', url)
print m.group(1)
URL Parsin никогда не как простой я, это, кажется, вот почему существует urlparse и urllib модули.
НАПРИМЕР:
import urllib
url ="http://www.domainname.com/page?CONTENT_ITEM_ID=1234¶m2¶m3"
query = urllib.splitquery(url)
result = "?".join((query[0], query[1].split("&")[0]))
print result
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'
Это все еще не 100%-й надежный, но намного больше, чем разделение его самостоятельно, потому что существует много допустимого формата ссылки, что Вы и я не знаем и обнаруживаем один день в журналах ошибок.
Я понял, что это ниже - то, что я должен был сделать:
url = "http://www.domainname.com/page?CONTENT_ITEM_ID=1234¶m2¶m3"
url = url[: url.find("&")]
print url
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'
Этот метод не зависит от положения параметра в строке URL. Это могло быть усовершенствовано, я уверен, но это понимает через.
url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234¶m2¶m3'
parts = url.split('?')
id = dict(i.split('=') for i in parts[1].split('&'))['CONTENT_ITEM_ID']
new_url = parts[0] + '?CONTENT_ITEM_ID=' + id
Посмотрите на urllib2 вопрос об имени файла для некоторого обсуждения этой темы.
Также см., что "Python Находит Вопрос" вопросом.
Древний вопрос, но все же я хотел бы отметить, что параметры строки запроса также могут быть разделены символом ';' не только '&'.