更改 urlparse.path 的 url

Man*_*ram 6 python urlparse python-3.x

这是python代码:

url = http://www.phonebook.com.pk/dynamic/search.aspx
path = urlparse(url)
print (path)

>>>ParseResult(scheme='http', netloc='www.phonebook.com.pk', path='/dynamic/search.aspx', params='', query='searchtype=cat&class_id=4520&page=1', fragment='')

print (path.path)
>>>/dynamic/search.aspx
Run Code Online (Sandbox Code Playgroud)

现在我需要将其更改path.path为我的要求。就像如果“/dynamic/search.aspx”是路径,那么我只需要第一个斜杠和最后一个斜杠之间的部分,包括“/dynamic/”的斜杠。

我已经尝试了这两行,但最终结果不是我所期望的,这就是为什么我问这个问题的原因,因为我对“urllib.parse”的了解不够。

path = path.path[:path.path.index("/")]
print (path)
>>>Returns nothing.
path = path.path[path.path.index("/"):]
>>>/dynamic/search.aspx (as it was before, no change.)
Run Code Online (Sandbox Code Playgroud)

简而言之,无论 path.path 结果是什么,我只需要目录名称。例如:“动态/搜索/search.aspx”。现在我需要“动态/搜索/”

Eme*_*mer 5

仅供参考,有一种更优雅的方法可以解决这个问题。

首先,path可以使用rfindwhich 返回最后一次出现的索引来获得所需的部分。的+ 1是保持了结尾的斜线。

desired_path = path.path[:path.path.rfind("/") + 1]
Run Code Online (Sandbox Code Playgroud)

二、使用_replace方法替换对象的path属性urlparse如下:

desired_url = urlunparse(path._replace(path=desired_path))
Run Code Online (Sandbox Code Playgroud)

完整的工作示例:

from urllib.parse import urlparse, urlunparse

url = "http://www.phonebook.com.pk/dynamic/search/search.aspx"
path = urlparse(url)

desired_path = path.path[:path.path.rfind("/") + 1]
desired_url = urlunparse(path._replace(path=desired_path))
Run Code Online (Sandbox Code Playgroud)

抱歉迟到了 2.66 年。


Iro*_*ist 1

我试图寻找urlparse任何对您的情况有帮助的方法,但没有找到,可能会被忽视,但无论如何,在这个级别,您可能必须制定自己的方法或黑客:

>>> path.path
'/dynamic/search.aspx'

>>> import re
>>> d = re.search(r'/.*/', path.path)
>>> d.group(0)
'/dynamic/'
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,您也可以使用内置方法,如下所示:

>>> i = path.path.index('/', 1)
>>> 
>>> path.path[:i+1]
'/dynamic/'
Run Code Online (Sandbox Code Playgroud)

编辑:

我没有注意到你的最后一个例子,所以这是另一种方法:

>>> import os
>>> path = os.path.dirname(path.path) + os.sep
>>> path
'/dynamic/'
>>> path = os.path.dirname(s) + os.sep
>>> path
'dynamic/search/'
Run Code Online (Sandbox Code Playgroud)

或者与re

>>> s
'dynamic/search/search.aspx'
>>> d = re.search(r'.*/', s)
>>> d
<_sre.SRE_Match object; span=(0, 15), match='dynamic/search/'>
>>> d.group(0)
'dynamic/search/'
>>> 
>>> s = '/dynamic/search.aspx'
>>> d = re.search(r'.*/', s)
>>> d.group(0)
'/dynamic/'
Run Code Online (Sandbox Code Playgroud)