Нарезка URL-адреса с помощью Python

Я работаю с огромным списком URL-адресов. Просто короткий вопрос, который я пытаюсь вырезать из URL-адреса, см. Ниже:

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

Как я мог вырезать:

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

Иногда после CONTENT_ITEM_ID есть более двух параметров, и идентификатор каждый раз отличается, я думаю, это можно сделать, найдя первый &, а затем отрезав символы перед этим &, не совсем уверен, как это сделать.

Ваше здоровье

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
8
0
6 590
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Я понял, что мне нужно было сделать ниже:

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'

Будьте осторожны - если нет параметров (нет "&"), он просто удалит последний символ из URL-адреса.

Rafał Dowgird 03.11.2008 17:38

См. stackoverflow.com/questions/229352/python-find-question для лучшего решения.

S.Lott 03.11.2008 17:42

Ах, я понимаю, как это может быть проблемой, и спасибо за предупреждение. Список, который я использую, всегда имеет параметр после него, но я буду помнить об этом в будущем. :)

RailsSon 03.11.2008 17:45

Будьте осторожны с парсингом URL, в большинстве случаев это не так просто, как кажется. Лучше использовать модуль urlparse, даже если кажется, что это просто.

e-satis 03.11.2008 18:37

@Eef: Всегда означает «в основном». Никогда не означает «редко». Как только вы скажете «Всегда», вы поймете, что он сломается, потому что 2 из 14 000 нарушают ваше правило «всегда».

S.Lott 03.11.2008 18:45

@ S.Lott: не могу не согласиться ...

tzot 03.11.2008 22:55

Приветствую за отличный совет !! Я все это беру на борт :)

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

Быстрое и грязное решение:

>>> "http://something.com/page?CONTENT_ITEM_ID=1234&param3".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&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

URL-адрес Parsin никогда не бывает таким простым, как кажется, поэтому существуют модули urlparse и urllib.

Напр .:

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'

Это все еще не на 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&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'

Древний вопрос, но все же я хотел бы отметить, что параметры строки запроса также могут быть разделены символом ';' не только '&'.

рядом с urlparse есть еще свернуть, у которого IMHO лучший API.

Другие вопросы по теме