Как я могу разбить строку URL-адреса на отдельные части в Python?

Решил, что сегодня вечером выучу питон :) Я очень хорошо знаю C (написал на нем ОС), поэтому я не новичок в программировании, поэтому все в python кажется довольно простым, но я не знаю, как решить эту проблему: допустим, у меня есть этот адрес:

http://example.com/random/folder/path.html Теперь, как я могу создать из этого две строки, одна из которых содержит "базовое" имя сервера, поэтому в этом примере это будет http://example.com/ и другой, содержащий объект без последнего имени файла, поэтому в этом примере это будет http://example.com/random/folder/ . Также я, конечно, знаю возможность просто найти 3-ю и последнюю косую черту соответственно, но, возможно, вы знаете способ получше:] Также было бы здорово иметь завершающую косую черту в обоих случаях, но мне все равно, так как ее можно легко добавить. Так у кого-нибудь есть хорошее, быстрое и эффективное решение для этого? Или есть только «моё» решение, нахождение косых черт?

Спасибо!

Возможно, вы захотите поделиться своим решением в коде.

monkut 16.01.2009 10:49

Приходи завтра и расскажи нам, как у тебя дела. Я подозреваю, что вы будете писать код C на Python, а не на реальном коде Python :-).

paxdiablo 16.01.2009 10:55

С тех пор, как вы это упомянули, какую ОС вы написали?

tzot 16.01.2009 16:01

Вы можете найти регулярное выражение Python для частичного разделения (то есть URL, схемы, домена, TLD, порта и пути запроса) здесь: stackoverflow.com/questions/9760588/…

Paolo Rovelli 12.08.2015 00:19
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
18
4
45 907
6

Ответы 6

У меня нет опыта работы с Python, но я нашел модуль urlparse, который должен работать.

В Python многие операции выполняются с использованием списков. Модуль urlparse, упомянутый Себасианом Дитцем, вполне может решить вашу конкретную проблему, но если вас в целом интересуют способы Pythonic для поиска слэшей в строках, например, попробуйте что-то вроде этого:

url = 'http://example.com/random/folder/path.html'
# Create a list of each bit between slashes
slashparts = url.split('/')
# Now join back the first three sections 'http:', '' and 'example.com'
basename = '/'.join(slashparts[:3]) + '/'
# All except the last one
dirname = '/'.join(slashparts[:-1]) + '/'
print 'slashparts = %s' % slashparts
print 'basename = %s' % basename
print 'dirname = %s' % dirname

Результат этой программы следующий:

slashparts = ['http:', '', 'example.com', 'random', 'folder', 'path.html']
basename = http://example.com/
dirname = http://example.com/random/folder/

Интересные биты - это split, join, массив нотации срезов [A: B] (включая отрицательные значения для смещений от конца) и, в качестве бонуса, оператор % для строк для форматирования в стиле printf.

Если это степень синтаксического анализа вашего URL, встроенный в Python rpartition выполнит эту работу:

>>> URL = "http://example.com/random/folder/path.html"
>>> Segments = URL.rpartition('/')
>>> Segments[0]
'http://example.com/random/folder'
>>> Segments[2]
'path.html'

Из Pydoc, str.rpartition:

Splits the string at the last occurrence of sep, and returns a 3-tuple containing the part before the separator, the separator itself, and the part after the separator. If the separator is not found, return a 3-tuple containing two empty strings, followed by the string itself

Это означает, что rpartition выполняет поиск за вас и разбивает строку по последнему (крайнему правому) вхождению указанного вами символа (в данном случае /). Он возвращает кортеж, содержащий:

(everything to the left of char , the character itself , everything to the right of char)

Модуль urlparse в python 2.x (или urllib.parse в python 3.x) был бы способом сделать это.

>>> from urllib.parse import urlparse
>>> url = 'http://example.com/random/folder/path.html'
>>> parse_object = urlparse(url)
>>> parse_object.netloc
'example.com'
>>> parse_object.path
'/random/folder/path.html'
>>> parse_object.scheme
'http'
>>>

Если вы хотите поработать над путем к файлу под URL-адресом, вы можете использовать модуль posixpath:

>>> from posixpath import basename, dirname
>>> basename(parse_object.path)
'path.html'
>>> dirname(parse_object.path)
'/random/folder'

После этого вы можете использовать posixpath.join, чтобы склеить части вместе.

Обновлено: Я совершенно забыл, что пользователи Windows будут задыхаться от разделителя пути в os.path. Я прочитал документацию модуля posixpath, и в ней есть специальная ссылка на манипуляции с URL-адресами, так что все в порядке.

+1 на urlparse, но не используйте os.path для управления частью .path. Обработка os.path обязательно отличается от ОС к ОС, тогда как URI всегда используют '/' в качестве разделителя частей пути.

bobince 16.01.2009 14:30

да, удалите часть os.path. Возможно, вместо этого используйте модуль posixpath. Тогда вы получите мой голос.

nosklo 16.01.2009 14:37

ах, пропустил это полностью. Прошло много времени с тех пор, как я использовал окна: |. Фиксированный.

sykora 16.01.2009 16:03

Для удобства, вот процедура для Py 2: import urlparse; parse_object = urlparse.urlparse(url)

patrick 29.06.2017 22:47

Большое спасибо другим респондентам, которые указали мне правильное направление своими ответами!

Похоже, что модуль posixpath, упомянутый в ответе sykora, недоступен в моей настройке Python (python 2.7.3).

Согласно эта статья кажется, что "правильный" способ сделать это - использовать ...

  • urlparse.urlparse и urlparse.urlunparse могут использоваться для отсоединения и повторного присоединения основы URL-адреса.
  • Функции os.path можно использовать для управления путем
  • urllib.url2pathname и urllib.pathname2url (чтобы сделать перенос имени пути переносимым, чтобы он мог работать в Windows и т.п.)

Так, например (не считая повторного присоединения базового URL-адреса) ...

>>> import urlparse, urllib, os.path
>>> os.path.dirname(urllib.url2pathname(urlparse.urlparse("http://example.com/random/folder/path.html").path))
'/random/folder'

Вы можете использовать библиотеку python furl:

f = furl.furl("http://example.com/random/folder/path.html")
print(str(f.path))  # '/random/folder/path.html'
print(str(f.path).split("/")) # ['', 'random', 'folder', 'path.html']

Чтобы получить доступ к слову после первого "/", используйте:

str(f.path).split("/") # random

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