忽略列表理解中的无元素的方法

时间:2014-07-30 00:20:10

标签: python list nonetype

示例代码

list = [i.get('content').encode('utf-8') for i in self.soup.find_all('meta',attrs={"name": "description"})]

问题是.encode('utf-8')会引发错误:

AttributeError: 'NoneType' object has no attribute 'encode'

如果列表中的一个元素是None

我想知道是否有一个' pythonic'将它保持在一行并忽略无元素的方法。例如,您可以在列表中放置if not None子句吗?感谢。

2 个答案:

答案 0 :(得分:5)

我会将其分解为初始提取的生成器表达式以限制查找,因此get仅为性能调用一次。

items_i = (i.get('content') for i in self.soup.find_all('meta',attrs={"name": "description"}))
items = [i.encode('utf-8') for i in items_i if i]

答案 1 :(得分:2)

你可以给.get一个默认参数来代替None

[i.get('content','').encode('utf-8') for i in self.soup.find_all('meta',attrs={"name": "description"})]

或者你可以将其过滤掉

[i.get('content').encode('utf-8') for i in self.soup.find_all('meta',attrs={"name": "description"}) if i.get('content') is not None]

你应该注意到它不是i,而是它的内容'