Я работаю с огромным списком URL-адресов. Просто короткий вопрос, который я пытаюсь вырезать из URL-адреса, см. Ниже:
http://www.domainname.com/page?CONTENT_ITEM_ID=1234¶m2¶m3
Как я мог вырезать:
http://www.domainname.com/page?CONTENT_ITEM_ID=1234
Иногда после CONTENT_ITEM_ID есть более двух параметров, и идентификатор каждый раз отличается, я думаю, это можно сделать, найдя первый &, а затем отрезав символы перед этим &, не совсем уверен, как это сделать.
Ваше здоровье






Я понял, что мне нужно было сделать ниже:
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'
См. stackoverflow.com/questions/229352/python-find-question для лучшего решения.
Ах, я понимаю, как это может быть проблемой, и спасибо за предупреждение. Список, который я использую, всегда имеет параметр после него, но я буду помнить об этом в будущем. :)
Будьте осторожны с парсингом URL, в большинстве случаев это не так просто, как кажется. Лучше использовать модуль urlparse, даже если кажется, что это просто.
@Eef: Всегда означает «в основном». Никогда не означает «редко». Как только вы скажете «Всегда», вы поймете, что он сломается, потому что 2 из 14 000 нарушают ваше правило «всегда».
@ S.Lott: не могу не согласиться ...
Приветствую за отличный совет !! Я все это беру на борт :)
import re
url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234¶m2¶m3'
m = re.search('(.*?)&', url)
print m.group(1)
Быстрое и грязное решение:
>>> "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']
Посмотрите вопрос urllib2 имя файла для обсуждения этой темы.
Также см. Вопрос "Python Найти вопрос".
Этот метод не зависит от позиции параметра в строке 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
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-адресов, которые вы и я не знаем и однажды обнаружите в журналах ошибок.
Используйте модуль 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'
Древний вопрос, но все же я хотел бы отметить, что параметры строки запроса также могут быть разделены символом ';' не только '&'.
рядом с urlparse есть еще свернуть, у которого IMHO лучший API.
Будьте осторожны - если нет параметров (нет "&"), он просто удалит последний символ из URL-адреса.