You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:21:32