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

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

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

Спасибо!

Ответы [ 6 ]

50 голосов
/ 16 января 2009

Модуль 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, так что все хорошо.

10 голосов
/ 16 января 2009

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

9 голосов
/ 16 января 2009

Если это размер парсинга вашего 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'

С Пидок , ул.отделение:

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)
7 голосов
/ 16 января 2009

В Python многие операции выполняются с использованием списков. Упомянутый Sebasian Dietz модуль 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.

2 голосов
/ 06 февраля 2013

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

Кажется, что модуль 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'
0 голосов
/ 02 декабря 2016

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

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