Подтвердить что ты не робот

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

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

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

Спасибо!

4b9b3361

Ответ 1

Модуль 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 для склеивания частей вместе.

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

Ответ 3

Если это размер вашего синтаксического анализа URL, встроенное разделение Python выполнит задание:

>>> 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)

Ответ 4

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

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.

Ответ 5

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

Кажется, что модуль 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'

Ответ 6

Вы можете использовать библиотеку 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)`enter code here`.split("/") # random