Разделить титульную часть URL-адреса на отдельный столбец - Python

Предположим, у меня есть URL-адрес следующим образом:

http://sitename.com/pathname?title=moviename&url=VIDEO_URL

Я хочу разобрать этот URL, чтобы получить отдельно часть заголовка и часть URL.

Я попробовал следующее,

from urlparse import urlparse
q = urlparse('http://sitename.com/pathname?title=moviename&url=VIDEO_URL')

После этого я получаю следующий результат:

q
ParseResult(scheme='http', netloc='sitename.com', path='/pathname', params='', query='title=moviename&url=VIDEO_URL', fragment='')

а также q.query имеет,

'title=moviename&url=VIDEO_URL'

Я не могу использовать q.query.title или q.query.url здесь. Есть ли способ, которым я могу получить доступ к этому? Я хотел бы разделить часть URL и заголовок отдельно на отдельные столбцы. Можем ли мы сделать это таким образом, или мы можем написать метод подстроки, который проверял бы, чтобы он начинался с "title" и заканчивался "&" и разделял его?

Спасибо

5 ответов

Решение

Ты можешь использовать urlparse.parse_qs здесь, чтобы сделать словарь параметров.

from urlparse import urlparse, parse_qs
q = urlparse('http://sitename.com/pathname?title=moviename&url=VIDEO_URL')
qs = parse_qs(q.query)
print qs["title"] # moviename
print qs["url"] # VIDEO_URL

Это самый надежный способ разбора параметров URL: гораздо лучше, чем split,

urlparse можно разобрать URL, оттуда получить query и разобрать что:

>>> import urlparse
>>> url = 'http://sitename.com/pathname?title=moviename&url=VIDEO_URL'
>>> urlparse.parse_qs(urlparse.urlparse(url).query)
{'title': ['moviename'], 'url': ['VIDEO_URL']}

Поскольку параметр строки запроса может появляться несколько раз, словарь предоставляет список найденных значений (даже если найдено только одно значение).

Эти ответы предназначены для анализа строки запроса. Чтобы пойти дальше и использовать точечную нотацию, см. Также Преобразовать Python dict в объект?

from collections import namedtuple
QS = namedtuple('QS', qs.keys())
dotted_qs = QS(**qs)
dotted_qs.url #['moviename']

Обратите внимание, что dict это возвращается из parse_qs может быть многозначным, поэтому список возвращает тип dotted.url, Вы можете свернуть его до единого значения с помощью точного понимания или parse_qsl:

qs = {k: v[0] for k, v in q.query.items()} 

Или же...

qs = dict(urlparse.parse_qsl(q.query.items()))

Надеюсь, это поможет.

Вы делаете все правильно, просто стандартный URL сделан из:

<SCHEME>://<NETLOC>/<PATH>?<QUERY>

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

>>> data = dict(item.split('=') for item in q.query.split('&'))
>>> data
{'url': 'VIDEO_URL', 'title': 'moviename'}
>>> print(data['url'])

и там у вас есть ваш URL! Это очень простая и каноническая версия того, что urlparse библиотека предлагает через parse_qsl() метод. Этот метод также конвертирует + в пробелы, обрабатывает ';' так же как & и удаляет кавычки URL.

Так что использовать urlparse's parse_qsl функция, все, что вам нужно сделать, это:

>> data =urlparse.parse_qsl(q.query)
{'url': 'VIDEO_URL', 'title': 'moviename'}
>>> print(data['url'])

NB: это не безопасно использовать parse_qsl чем split() метод, но более НАДЕЖНЫЙ. Основное отличие состоит в том, что parse_qsl будет работать со всеми возможными вариантами использования запросов, как определено RFC, тогда как split() Метод работает с одним случаем.

Чтобы получить только параметры запроса, разделенные на '&', вы можете использовать:

q.query.split('&')

Или, чтобы получить пары параметр / значение, вы можете использовать:

args = [tuple(arg.split('=')) for arg in q.query.split('&')]

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