Разделить титульную часть 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('&')]