iOS POST请求实现:发送完整问题并获取常见答案示例需求
解决思路与代码示例
首先,你的代码里有几个关键问题导致没拿到预期结果:
- Google 搜索接口不支持用POST请求获取结果,它默认接受GET请求,而且需要把查询参数正确编码后拼在URL里
- 直接请求
google.com/search返回的是HTML网页,不是JSON数据,所以你用JSONSerialization解析肯定拿不到想要的Answer字段 - 你没有对查询字符串做URL编码,直接把带空格的字符串传进去,这会导致请求格式错误
修正后的基础请求代码(GET方式)
先把请求改成正确的GET方式,并且自动处理参数编码:
import UIKit @IBAction func GetAnswer(_ sender: Any) { // 1. 用URLComponents构建请求URL,自动处理参数编码(比如空格会转成%20) guard var components = URLComponents(string: "https://www.google.com/search") else { print("无效的URL格式") return } components.queryItems = [URLQueryItem(name: "q", value: questionAsked)] guard let myUrl = components.url else { print("创建URL失败") return } var request = URLRequest(url: myUrl) request.httpMethod = "GET" // Google搜索接口仅支持GET请求 let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in if let error = error { print("请求错误: \(error.localizedDescription)") return } guard let data = data else { print("服务器未返回数据") return } // 这里返回的是HTML内容,先转成字符串确认返回结果 if let htmlString = String(data: data, encoding: .utf8) { print("返回的HTML内容预览:\n\(htmlString.prefix(500))") // 下一步需要解析HTML提取答案,下面会给出示例 } } task.resume() }
提取搜索结果中的常见答案
因为Google返回的是HTML页面,要提取答案需要用HTML解析库,推荐用SwiftSoup(可以通过CocoaPods或Swift Package Manager安装)。
下面是用SwiftSoup提取Google搜索的直接答案(比如知识面板、顶部摘要)的示例:
// 先确保已导入SwiftSoup import SwiftSoup // 在dataTask的回调里替换之前的HTML打印代码: if let htmlString = String(data: data, encoding: .utf8) { do { let doc = try SwiftSoup.parse(htmlString) // 尝试提取Google知识面板的直接答案(选择器可能会随页面更新变化,需验证) let directAnswer = try doc.select("div.Z0LcW").first()?.text() DispatchQueue.main.async { if let answer = directAnswer { self.AnswerView.text = "答案: \(answer)" } else { // 如果没有直接答案,提取第一个搜索结果的标题和摘要 let firstTitle = try? doc.select("h3").first()?.text() ?? "未找到匹配结果" let firstSnippet = try? doc.select("div.IsZvec").first()?.text() ?? "无摘要" self.AnswerView.text = "\(firstTitle!)\n\(firstSnippet!)" } } } catch { print("HTML解析错误: \(error)") } }
额外提示
- Google的网页结构可能会随时调整,上面的CSS选择器(比如
div.Z0LcW)如果失效,需要打开浏览器开发者工具查看最新的元素选择器 - 如果想更稳定地获取结构化答案,推荐使用Google Custom Search API,它会返回JSON格式的结构化结果,不过需要申请API密钥和自定义搜索引擎ID
内容的提问来源于stack exchange,提问作者user11383986
相关产品推荐
相关产品推荐

