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

《Python自动化枯燥工作》I'm Feeling Lucky项目代码失效求助

问题原因与解决方案

嘿,我刚好碰到过这个问题!咱们一步步来拆解原因和修复方法:

为什么原来的代码失效了?

Google的搜索结果页面结构一直在迭代更新,《Automate the Boring Stuff》里的代码依赖的.r类选择器,现在已经从Google的搜索结果DOM结构中移除了。另外,Google会检测非浏览器发起的请求(比如requests库默认的请求头),可能返回简化版或者反爬的页面,这也会导致选择器找不到对应元素,最终linkElems变成空列表。

修复后的完整代码

import webbrowser, requests, bs4

def im_feeling_lucky():
    # 格式化搜索关键词为Google支持的格式
    search = '+'.join(input('Search Google: ').split(" "))
    # 添加浏览器请求头,模拟真实浏览器访问,避免被Google识别为爬虫
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
    # 拉取Google搜索页面内容
    print('Googling...') # 下载时显示提示文本
    res = requests.get(f'https://google.com/search?q={search}&oq={search}', headers=headers)
    res.raise_for_status()
    # 解析HTML页面
    soup = bs4.BeautifulSoup(res.text, features='lxml')
    # 替换为当前Google搜索结果的有效链接选择器
    linkElems = soup.select('.yuRUbf a') # 该选择器对应搜索结果的标题链接
    numOpen = min(5, len(linkElems))
    print('Opening top results...')
    for i in range(numOpen):
        # 现在href是完整的目标URL,无需拼接Google域名前缀
        webbrowser.open(linkElems[i].get("href"))

关键修改点说明

  • 添加请求头:通过User-Agent模拟浏览器请求,确保获取到的页面和你在浏览器里看到的一致,避免Google返回特殊的反爬页面。
  • 更新CSS选择器:当前(2024年)Google搜索结果的标题链接都包裹在类名为yuRUbf的容器里,.yuRUbf a可以准确选中这些链接。
  • 简化链接拼接:现在搜索结果的href属性已经是完整的目标URL,不需要再拼接http://google.com前缀了。

以后遇到类似问题怎么办?

如果哪天这个选择器又失效了,你可以自己动手排查:

  1. 打开Google搜索任意关键词,右键点击搜索结果标题,选择「检查」。
  2. 在开发者工具里找到对应的<a>标签,查看它的父元素或者自身的类名、ID等标识。
  3. 把soup.select()里的选择器替换成新的标识即可。

内容的提问来源于stack exchange,提问作者Zack Plauché

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:27:08