使用Python切割URL

8

我正在处理一个巨大的URL列表。我有一个快速的问题,想要从URL中截取一部分,如下所示:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3

我该如何切割出:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234

有时候在CONTENT_ITEM_ID后面会有两个以上的参数,而且每次的ID都不同。我想可以通过找到第一个“&”并将其前面的字符切掉来实现,但不太确定如何操作。
祝好
10个回答

14

使用urlparse模块。检查此函数:

import urlparse

def process_url(url, keep_params=('CONTENT_ITEM_ID=',)):
    parsed= urlparse.urlsplit(url)
    filtered_query= '&'.join(
        qry_item
        for qry_item in parsed.query.split('&')
        if qry_item.startswith(keep_params))
    return urlparse.urlunsplit(parsed[:3] + (filtered_query,) + parsed[4:])
在您的示例中:

>>> process_url(a)
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'

这个函数的附加好处是,如果您决定还需要一些查询参数,或者参数的顺序不固定,那么使用起来会更加容易,例如:

>>> url='http://www.domainname.com/page?other_value=xx&param3&CONTENT_ITEM_ID=1234&param1'
>>> process_url(url, ('CONTENT_ITEM_ID', 'other_value'))
'http://www.domainname.com/page?other_value=xx&CONTENT_ITEM_ID=1234'

4
快速且简单的解决方案如下:
>>> "http://something.com/page?CONTENT_ITEM_ID=1234&param3".split("&")[0]
'http://something.com/page?CONTENT_ITEM_ID=1234'

3
另一种选择是使用split函数,并将&作为参数。这样,您可以提取基本url和两个参数。
   url.split("&") 

返回一个包含列表的数据。
  ['http://www.domainname.com/page?CONTENT_ITEM_ID=1234', 'param2', 'param3']

1

我想通了,以下是我需要做的:

url = "http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3"
url = url[: url.find("&")]
print url
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'

小心这个问题 - 如果没有参数(没有“&”),它将会从URL中删除最后一个字符。 - Rafał Dowgird
请查看http://stackoverflow.com/questions/229352/python-find-question以获取更好的解决方案。 - S.Lott
啊,我明白那可能是个问题,谢谢你的提醒。我使用的列表始终有一个参数跟在后面,但将来我会记住这一点的。 :) - RailsSon
在处理URL时要小心,这通常并不像看起来那么容易。最好使用urlparse模块,即使它看起来很简单。 - Bite code
@S.Lott: 完全同意… - tzot
显示剩余2条评论

1
解析URL并不像看起来那么简单,这就是为什么有urlparse和urllib模块的原因。
例如:
import urllib
url ="http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3"
query = urllib.splitquery(url)
result = "?".join((query[0], query[1].split("&")[0]))
print result
'http://www.domainname.com/page?CONTENT_ITEM_ID=1234'

虽然这还不是100%可靠的,但比自己拆分要好得多,因为有许多有效的URL格式,你和我可能不知道,并在错误日志中发现。


0
import re
url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3'
m = re.search('(.*?)&', url)
print m.group(1)

0

这种方法不依赖于参数在url字符串中的位置。我相信这可以进一步完善,但它已经能传达要点了。

url = 'http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3'
parts = url.split('?')
id = dict(i.split('=') for i in parts[1].split('&'))['CONTENT_ITEM_ID']
new_url = parts[0] + '?CONTENT_ITEM_ID=' + id

0
一个古老的问题,但是我想指出查询字符串参数不仅可以用'&'分隔,还可以用';'分隔。

0

0

除了urlparse之外,还有furl,它的API更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接