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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:09:53