Python过滤/删除列表中的URL

时间:2008-11-03 11:34:19

标签: python url list filter

我有一个URL的文本文件,大约14000.以下是几个例子:

http://www.domainname.com/pagename?CONTENT_ITEM_ID=100&param2=123
http://www.domainname.com/images?IMAGE_ID=10
http://www.domainname.com/pagename?CONTENT_ITEM_ID=101&param2=123
http://www.domainname.com/images?IMAGE_ID=11
http://www.domainname.com/pagename?CONTENT_ITEM_ID=102&param2=123

我已将文本文件加载到Python列表中,并且我尝试将所有带有CONTENT_ITEM_ID的URL分离为自己的列表。在Python中执行此操作的最佳方法是什么?

干杯

4 个答案:

答案 0 :(得分:21)

这是格雷姆的另一种替代方法,使用更新的列表理解语法:

list2= [line for line in file if 'CONTENT_ITEM_ID' in line]

您更喜欢的是品味问题!

答案 1 :(得分:6)

我喜欢@ bobince的答案(+1),但会提高赌注。

由于你有一个相当大的起始集,你可能希望避免将整个列表加载到内存中。除非您需要其他内容的整个列表,否则您可以使用Python generator expression执行相同的任务,方法是在请求时逐项构建已过滤的列表:

for filtered_url in (line for line in file if 'CONTENT_ITEM_ID' in line):
   do_something_with_filtered_url(filtered_url)

答案 2 :(得分:5)

list2 = filter( lambda x: x.find( 'CONTENT_ITEM_ID ') != -1,  list1 )

过滤器调用list1(第二个参数)的每个元素上的函数(第一个参数)。如果函数返回true(非零),则将元素复制到输出列表。

lambda基本上创建了一个临时的未命名函数。这只是为了避免必须创建一个函数然后传递它,如下所示:

function look_for_content_item_id( elem ):
    if elem.find( 'CONTENT_ITEM_ID') == -1:
        return 0
    return 1
list2 = filter( look_for_content_item_id, list1 )

答案 3 :(得分:5)

为了完整;您也可以使用ifilter。它就像过滤器,但没有建立列表。

from itertools import ifilter

for line in ifilter(lambda line: 'CONTENT_ITEM_ID' in line, urls):
    do_something(line)