gpt4 book ai didi

html - 使用 Alamofire 的谷歌搜索失败(iOS、Swift、JSON、HTML)

转载 作者:太空狗 更新时间:2023-10-29 14:17:14 24 4
gpt4 key购买 nike

求助!几个月来,我一直在尝试在我的 Swift 应用程序上执行简单的 Google 搜索,但我的头撞墙已经过去了!

我已经尝试使用 ALAMOFIRE 和常规 URLRequest,但由于结果似乎只是 HTML 格式,我似乎无法正确解析结果。即使您查看 HTML 格式,代码也是针对网页的,并且不包括搜索结果。

我希望将搜索结果放入简单词典中。 这是我的代码:

        let googleUrl:String = "https://cse.google.com/cse/publicurl?&output=json&cx=<MyGoogleKey>:<MyGoogleSKey>&q=q=+normal+search"

// Trying with AlamoFire:

Alamofire.request(googleUrl).response { response in
print("Request: \(response.request)")
print("Response: \(response.response)")
print("Error: \(response.error)")
}.responseJSON(completionHandler: { response in
print("ResponseJSON: \(response)")
}).responseData(completionHandler: { response in
print("ResponseData: \(response)")
}).responseString(completionHandler: { response in
print("ResponseString: \(response)")
})

如您所见,我尝试了几乎所有 Alamofire 支持的类型的响应,但我一无所获。

这是错误 #1 (.responseJSON):

无法读取数据,因为它的格式不正确。ResponseJSON:失败:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(错误域=NSCocoaErrorDomain代码=3840“字符0周围的值无效。”UserInfo={NSDebugDescription=字符0周围的值无效。}))

这是数据响应 (.responseData):响应数据:成功:4337 字节

这是响应 HTML (.responseString)

响应字符串:成功:

*> Google 自定义搜索

(function(){var cookie_path='/cse/';var path_copy='/coop/';window._gaq = window._ga...._AND_SO_ON_TILL_FULL_HTML_PAGE_IN_A_STRING....*

* 我只希望我能在一个简单的字典中得到搜索结果...

有人吗?请问?

最佳答案

您似乎在使用自定义搜索 API 嵌入到网页中。

documentation是为了你想做的事。

下面是一个使用堆栈溢出作为搜索域的示例。

import UIKit
import Alamofire

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

search(query: "swift") { (results) in

for result in results {

dump(result)
}
}
}

func search(query:String, completion: @escaping (Array<SearchResult>)->()){

let id = "Custom search engine ID"

let key = "API key"

let url = "https://www.googleapis.com/customsearch/v1?key=\(key)&cx=\(id)&q=\(query)"

Alamofire.request(url).responseJSON { (response) in

var results = Array<SearchResult>()

if let dict = response.value as? Dictionary<String,Any> {

if let items = dict["items"] as? Array<Dictionary<String,Any>> {

for item in items {

if let result = SearchResult(dict: item) {

results.append(result)

} else {

print("Incomplete search result data.")
}
}
}
}

completion(results)
}
}
}

我有这个结构来更好地存储搜索结果。它不包含 JSON 结果所包含的所有值。我只是选择了这些进行测试。

struct SearchResult {

var displayLink: String

var formattedUrl: String

var htmlFormattedUrl: String

var htmlSnippet: String

var htmlTitle: String

var link: String

var snippet: String

var title: String

init?(dict:Dictionary<String,Any>) {

guard

let displayLink = dict["displayLink"] as? String,

let formattedUrl = dict["formattedUrl"] as? String,

let htmlFormattedUrl = dict["htmlFormattedUrl"] as? String,

let htmlSnippet = dict["htmlSnippet"] as? String,

let htmlTitle = dict["htmlTitle"] as? String,

let link = dict["link"] as? String,

let snippet = dict["snippet"] as? String,

let title = dict["title"] as? String

else {

return nil
}

self.displayLink = displayLink

self.formattedUrl = formattedUrl

self.htmlFormattedUrl = htmlFormattedUrl

self.htmlSnippet = htmlSnippet

self.htmlTitle = htmlTitle

self.link = link

self.snippet = snippet

self.title = title
}
}

这是 dump(result) 打印出来的几个结果。

▿ CustomGoogleSearch.SearchResult
- displayLink: "stackoverflow.com"
- formattedUrl: "https://stackoverflow.com/questions/tagged/swift"
- htmlFormattedUrl: "https://stackoverflow.com/questions/tagged/<b>swift</b>"
- htmlSnippet: "<b>Swift</b> is an open-source programming language developed by Apple. Use the tag <br>\nonly for questions about language features, or requiring code in <b>Swift</b>. Use the&nbsp;..."
- htmlTitle: "Newest &#39;<b>swift</b>&#39; Questions - Stack Overflow"
- link: "https://stackoverflow.com/questions/tagged/swift"
- snippet: "Swift is an open-source programming language developed by Apple. Use the tag \nonly for questions about language features, or requiring code in Swift. Use the ..."
- title: "Newest \'swift\' Questions - Stack Overflow"

▿ CustomGoogleSearch.SearchResult
- displayLink: "stackoverflow.com"
- formattedUrl: "stackoverflow.com/documentation/swift/topics"
- htmlFormattedUrl: "stackoverflow.com/documentation/<b>swift</b>/topics"
- htmlSnippet: "58 example-focused documentation topics for <b>Swift</b> Language."
- htmlTitle: "All <b>Swift</b> Language Topics - Stack Overflow"
- link: "http://stackoverflow.com/documentation/swift/topics"
- snippet: "58 example-focused documentation topics for Swift Language."
- title: "All Swift Language Topics - Stack Overflow"

获取 key

在此page , 单击 Get A Key 按钮。

Get API Key Button

然后您需要选择或创建一个 Google 项目,然后您将获得一个 API key 。所以将其复制并放在此处 let key = "API key"

对于搜索引擎 ID,请转到您的 console .现在要么选择一个搜索引擎,要么创建一个新的搜索引擎。您将进入这样的页面。

Google Custom Search Engine Settings Page

单击搜索引擎 ID 按钮,这将显示一个带有您的 ID 的屏幕,然后将其放在此处 let id = "Custom search engine ID"

关于html - 使用 Alamofire 的谷歌搜索失败(iOS、Swift、JSON、HTML),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com