网页爬虫时已判断元素存在仍报NoneType不可迭代如何解决?
报错原因
你仅校验了最外层的spec-list attributes-sexuality类div是否存在,没有覆盖另外两个异常场景:
- BeautifulSoup的
find()方法不支持ul.attribute-list.copy-small>li这种复合CSS选择器写法,该写法会让find()尝试查找标签名等于整段字符串的元素,必然返回None,迭代None就会触发当前报错 - 即使修正选择器语法,也存在外层div存在、但内部ul/li子元素缺失的情况,此时查询子元素依然会返回None,迭代同样会报错
修复方案
优先使用支持CSS选择器的select()方法查询子元素,select()找不到匹配元素时会返回空列表而非None,天然避免迭代报错的问题,修正后的代码如下:
# 提前存储外层div查询结果,避免重复执行查询 sexuality_div = soup.find('div', class_='spec-list attributes-sexuality') if sexuality_div: # select查询所有符合要求的li,无结果返回空列表 li_items = sexuality_div.select('ul.attribute-list.copy-small li') sexuality = ', '.join([x.get_text(strip=True) for x in li_items]) else: sexuality = ''
该写法无需额外判断子元素是否存在:如果子元素缺失,li_items为空列表,列表推导和join操作执行后得到的就是空字符串,和else分支的默认值逻辑一致。
内容的提问来源于stack exchange,提问作者user17087759
相关产品推荐
相关产品推荐

