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

使用BeautifulSoup爬取在线词典单词时的while与for循环问题

问题根源

你的page变量初始化位置错误,放在了遍历字母的for循环外层。当首个字母A的100页内容处理完成后,page的值已经变为100,后续遍历B、C字母时,while page != 100的判断条件直接不成立,不会进入页码循环,因此只能拿到A开头的单词。

修正后的代码

将page = 1的初始化逻辑挪到字母遍历的for循环内部,每次处理新字母时重置页码:

def get_data():
    letters = ['A', 'B', 'C']
    all_words = []

    for letter in letters:
        page = 1 # 每次处理新字母时重置页码为1
        while page != 100:
            url = f"https://dictionnaire.lerobert.com/explore/def/{letter}/{page}"
            soup = BeautifulSoup(requests.get(url=url).text, 'html.parser')
            data = soup.find(class_='l-l')
            if not data: # 提前判断节点是否存在,避免后续报错
                break
            for word in data.find_all('a'):
                all_words.append(word['href'])
            page = page + 1

    print(all_words)
    print(len(all_words))
此前把while循环移到外层逻辑错误的原因

该逻辑会按「第1页遍历A/B/C三个字母的对应页面→第2页遍历A/B/C三个字母的对应页面→…→第100页遍历」的顺序执行,当某个字母的实际总页数小于100时,超过页数的请求不会返回有效单词,甚至会因为找不到对应节点触发报错,你拿到的额外几十个单词大概率是B、C字母前几页的内容,其余都是无效请求,因此总数量远低于预期。

优化建议
  • 不要硬编码页码上限为100,不同首字母的单词总页数不同,有的可能只有几十页,硬写100会产生大量无效请求
  • 可以在每次请求后判断data是否存在,不存在就直接终止当前字母的页码循环,既避免报错也能减少无效请求
  • 可以给请求加延迟,避免触发网站的反爬机制导致IP被封禁

内容的提问来源于stack exchange,提问作者bientavu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:36:04