AttributeError: 'dict_values'对象没有'rsplit'属性

4 投票
2 回答
6651 浏览
提问于 2025-04-17 22:32

我正在尝试对从文本文件生成的URL进行反向拆分,但在打印拆分后的值时遇到了上面的错误。我试过把URL变成一个字符串再进行拆分,但这样会导致图形界面完全卡住,甚至连错误信息都不显示。我的代码在这里:

a = URLS.rsplit('=', 1)

我在尝试从URL解析出一个字符串然后进行拆分时使用的代码在这里:

urlstr = str(URLS)
a = urlstr.rsplit('=', 1)
print(a)

有没有人能告诉我为什么我不能用拆分方法来处理这个URL(这些URL是在一个字典里定义的),或者为什么创建一个字符串后再拆分也不行?

谢谢

2 个回答

1

dict_values对象是一种序列。它没有rsplit这个方法,但str对象是有的。

其实,和其使用rsplit相比,你更应该使用urllib.parse来从你的网址中提取信息。

比如说,

>>> import urllib.parse as parse
>>> url = 'http://stackoverflow.com/questions?x=foo&y=bar'
>>> parse.urlsplit(url)
SplitResult(scheme='http', netloc='stackoverflow.com', path='/questions', query='x=foo&y=bar', fragment='')
>>> parse.urlsplit(url).query
'x=foo&y=bar'
>>> parse.parse_qs(parse.urlsplit(url).query)
{'x': ['foo'], 'y': ['bar']}

所以,如果URLS是一个字典,你可以通过循环它的值来提取参数值,使用

>>> URLS = {'a': 'http://stackoverflow.com/questions?x=foo&y=bar'}
>>> for url in URLS.values():
...     print(parse.parse_qs(parse.urlsplit(url).query))
... 
{'x': ['foo'], 'y': ['bar']}

rsplit不同,parse_qs可以让你正确地解码百分号编码的查询字符串,并且可以控制空值的解析。

3

这个错误提示说明 URLS 不是一个字符串,而是一个 dict_values 对象。我想这是你在调用字典的 values 方法时得到的结果(在 Python 3 中)。这个值的视图是一个可迭代的对象,所以你可能想要对它进行循环处理,可以用类似下面的方式:

for url in URLS:
    a = url.rsplit("=", 1)
    # do stuff with a here

或者如果你想要得到各种 a 值的列表,你可以使用列表推导式:

a_lst = [url.rsplit("=", 1) for url in URLS]

撰写回答