url数据任务在使用SwiftSoup解析时没有显示正确的内容?斯威夫特5



我很新的swift和有一个应用程序,执行一个简单的url数据任务来解析该网站的html内容。我试图加载某些元素,但没有得到我在网站上看到的内容,当我手动检查它。我真不知道出了什么问题。

我想我的问题是;是否有一种方法来加载内容,因为它会出现,如果我手动搜索这个网站?

相关代码如下:

import SwiftSoup
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"]

let session = URLSession(configuration: config)

let url = URL(string: link)
let task = session.dataTask(with: url!) { [self] (data, response, error) in            
do {
let htmlContent = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
let doc: Document = try SwiftSoup.parse(htmlContent! as String)
let elements = try doc.getAllElements().array()                    

} catch Exception.Error(type: let type, Message: let message) {
print(type)
print(message)
} catch {
print("error")
}

}

请让我知道是否有任何方法可以做到这一点,即使它涉及到使用不同的包来解析数据。这对我的应用程序非常重要。我将非常感谢任何可能的帮助!

谢谢。

我怀疑问题可能是您的用户代理正在发送到您正在解析其响应的网站。

用户代理是一个字符串,它与请求一起发送到url(作为附加头)。它可以识别你是什么类型的东西,以便可以发送适当的响应。

例如,如果您从Mac上的Safari在Big Sur上请求,则用户代理可能是:

"Mozilla/5.0(麦金塔电脑;AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15">

而iPad可能是:

"Mozilla/5.0 (iPad;AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Mobile/15E148 Safari/604.1">

服务请求的站点使用用户代理来确定返回哪种响应以及包含哪些功能(完整站点、移动站点、文本站点等)。

对于Swift应用中的URLSession,用户代理是应用的bundle名。因此,该网站可能会因此而感到困惑,并返回与您在浏览器中访问时看到的内容不同的内容。

一些选择:

浏览一下这个网站,它可能有一个更好的url来获取你想要的信息。

更改要发送的用户代理字符串。基本步骤如下:

let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["User-Agent": "User-Agent String Here"]
let session = URLSession(configuration: config)

你可能需要调整你对共享会话的使用来支持这一点(例如:在你的配置中创建一个会话并使用它,如上所述,或者检查是否有一种方法来覆盖你使用共享会话的请求头)。

我找到了一个适合我的解决方案。以下是相关代码:

private let webView: WKWebView = {
let prefs = WKPreferences()
prefs.javaScriptEnabled = true
let config = WKWebViewConfiguration()
config.preferences = prefs
let webView = WKWebView(frame: .zero, configuration: config)
return webView
}()
override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(webView)
webView.navigationDelegate = self

}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
parseData()        
}

func parseData() {

DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) { [unowned self] in
webView.evaluateJavaScript("document.body.innerHTML") { result, error in
guard let htmlContent = result, error == nil else {
print("error")
return
}                

do {
let doc = try SwiftSoup.parse(htmlContent as! String)
var allProducts = try doc.getAllElements.array()
} catch {
print("error")
}

}

}   

}

使用WebView首先加载网站,然后在延迟后解析数据对我来说是一个可行的解决方案。它可能不是最好的主意,有一个固定的延迟,所以如果有人有任何其他的建议,这将是高度赞赏!

最新更新