Django中用BeautifulSoup获取Google搜索结果返回异常内容求助
修复Django中使用BeautifulSoup获取Google搜索结果的问题
问题根源
- 关键词获取错误:你直接把Django的
request对象拼接到搜索URL里,而非提取表单提交的keyword参数,导致Google实际搜索的是django.http.request这个字符串,自然返回Django文档相关结果。 - 循环逻辑错误:
results.append()写在for循环外部,只会将最后一条结果加入列表,无法获取前2条结果。 - 链接解析错误:Google搜索结果的a标签href是内部跳转链接(格式为
/url?q=实际链接&...),直接提取会得到无效路径,需要解析出真实目标URL。 - 潜在风险:未处理元素不存在的情况,一旦页面结构变化会直接报错;同时旧版User-Agent可能被Google识别为爬虫,限制访问。
修正后的views.py代码
from django.shortcuts import render import requests from bs4 import BeautifulSoup from urllib.parse import urlparse, parse_qs def search(request): if request.method == "POST": # 提取表单提交的关键词 keyword = request.POST.get('keyword', '').strip() if not keyword: return render(request, "result.html", {"results": []}) # 正确拼接搜索URL url = f"https://www.google.com/search?q={keyword}" 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" } response = requests.get(url, headers=headers) response.raise_for_status() soup = BeautifulSoup(response.text, "html.parser") results = [] # 适配Google当前页面结构的选择器(后续若失效需自行微调) search_results = soup.select("div.g")[:2] for result in search_results: # 容错处理:标题不存在时显示默认文本 title_tag = result.select_one("h3") title = title_tag.get_text(strip=True) if title_tag else "无标题" # 解析Google跳转链接,提取真实URL link_tag = result.select_one("a") if link_tag: href = link_tag.get("href") if href.startswith('/url?'): parsed_url = urlparse(href) real_link = parse_qs(parsed_url.query).get('q', [''])[0] else: real_link = href else: real_link = "无链接" # 注意缩进:将结果添加到列表的操作放在循环内部 results.append({"title": title, "link": real_link}) return render(request, "result.html", {"results": results}) return render(request, "result.html")
模板小修正
你的HTML模板里有多余的</textarea>标签,需删除,修正后的表单部分如下:
<!-- Form --> <form method="POST" action="{% url 'results' %}"> {% csrf_token %} <div class="mt-4"> <div class="col"> <input type="text" name="keyword" class="form-control" placeholder="Enter keyword" required="required"> </div> <button type="submit" class="btn btn-primary mt-2">Go</button> </div> </form>
注意事项
- Google页面结构会不定期更新,若选择器失效,需打开浏览器开发者工具查看最新元素结构,调整CSS选择器。
- 频繁请求Google搜索可能触发IP限制,建议添加请求间隔,或根据需求使用代理。
- 确保已安装依赖包:
pip install requests beautifulsoup4
内容的提问来源于stack exchange,提问作者Saravanan Ragavan
相关产品推荐
相关产品推荐

