Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python切片URL_Python_Url_String - Fatal编程技术网

用Python切片URL

用Python切片URL,python,url,string,Python,Url,String,我正在处理一个巨大的URL列表。只是一个简单的问题,我试图将URL的一部分切掉,请参见以下内容: http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3 我怎样才能切掉: http://www.domainname.com/page?CONTENT_ITEM_ID=1234 有时在CONTENT\u ITEM\u ID之后有两个以上的参数,并且每次ID都不同,我认为可以通过找到第一个来完成&然后在那之

我正在处理一个巨大的URL列表。只是一个简单的问题,我试图将URL的一部分切掉,请参见以下内容:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234&param2&param3
我怎样才能切掉:

http://www.domainname.com/page?CONTENT_ITEM_ID=1234
有时在CONTENT\u ITEM\u ID之后有两个以上的参数,并且每次ID都不同,我认为可以通过找到第一个来完成&然后在那之前切掉字符-,不太确定如何做到这一点


干杯

我发现下面是我需要做的:

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'

快速而肮脏的解决方案是:

>>> "http://something.com/page?CONTENT_ITEM_ID=1234&param3".split("&")[0]
'http://something.com/page?CONTENT_ITEM_ID=1234'

另一个选项是使用split函数,并将&作为参数。这样,您将同时提取基本url和两个参数

   url.split("&") 
返回一个包含

  ['http://www.domainname.com/page?CONTENT_ITEM_ID=1234', 'param2', 'param3']
看这个问题,讨论一下这个话题


另请参见“”问题。

此方法不依赖于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

parsinurl从来没有像看上去那么简单,这就是为什么会有urlparse和urllib模块

例如:

这仍然不是100%可靠,但比自己拆分要可靠得多,因为有很多有效的url格式您和我都不知道,并且有一天在错误日志中发现了这些格式。

使用该模块。检查此功能:

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'

这是一个古老的问题,但我仍然想指出,查询字符串参数也可以用“;”分隔不仅“&.”

在urlparse旁边还有一个,它有更好的API。

注意这一点-如果没有参数(没有“&”),它只会从url中删除最后一个字符。请参阅以获得更好的解决方案。啊,我知道这可能是一个问题,谢谢您的警告。我使用的列表后面总是有一个参数,但我以后会记住这一点。:)对url解析要小心,大多数情况下这并不像看上去那么容易。您最好使用urlparse模块,即使它看起来很简单。@Eef:始终表示“大部分”。从不意味着“很少”。只要你说“永远”,你就知道它会破裂,因为14000人中有2人违反了你的“永远”规则。
>>> 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'