Python爬取H1标签遇空列表触发IndexError,如何替换为字符串?
解决爬取H1标签时的IndexError问题
首先咱们先捋清楚报错的原因:当某个网站没有H1标签时,soup.find_all('h1')会返回空列表,那titles = [(h1.get_text()).strip() for h1 in h1tag]就会生成一个空列表。之后你把这个空列表加到new_flagged_list里,到最后执行[x[0] for x in new_flagged_list]的时候,遇到空列表x去访问x[0],自然就触发IndexError了——空列表根本没有第0个元素呀!
你之前写的if new_flagged_list == ['']:判断逻辑不对,因为new_flagged_list是包含多个元素的列表(每个元素对应一个网站的titles列表),它永远不会等于[''],所以这个判断完全没起作用。
下面给你两种简单可行的解决思路:
思路一:生成titles时直接处理空情况
在循环里检测是否存在H1标签,没有的话直接给titles设置包含占位符的列表,这样后续访问索引0就不会出错:
list_flagged = df['Websites'].to_list() new_flagged_list = [] for site in list_flagged: quote_page = requests.get(site, headers=random_header) soup = BeautifulSoup(quote_page.text, 'html.parser') h1tag = soup.find_all('h1') if h1tag: # 当存在H1标签时处理文本 titles = [(h1.get_text()).strip() for h1 in h1tag] else: # 无H1标签时设置自定义占位符 titles = ['无H1标签'] # 这里可以换成你想要的任意字符串 new_flagged_list.append(titles) print('appended') # 此时new_flagged_list里没有空列表,可安全取索引0 new = [x[0] for x in new_flagged_list]
思路二:生成new列表时做条件判断
如果不想修改循环内的逻辑,也可以在最后生成new列表时,用条件表达式判断每个子列表是否为空:
list_flagged = df['Websites'].to_list() new_flagged_list = [] for site in list_flagged: quote_page = requests.get(site, headers=random_header) soup = BeautifulSoup(quote_page.text, 'html.parser') h1tag = soup.find_all('h1') titles = [(h1.get_text()).strip() for h1 in h1tag] new_flagged_list.append(titles) print('appended') # 用条件表达式处理空列表,替换为自定义字符串 new = [x[0] if x else '无H1标签' for x in new_flagged_list]
这样不管子列表是空还是有内容,都能正常生成new列表,不会触发索引错误。另外建议你可以给requests.get加上try-except异常处理,避免单个网站请求失败导致整个脚本终止。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

