ios - 使用 SwiftSoup 解析时,url 数据任务未显示正确的内容?斯威夫特 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 的字符串(作为附加标头)。它识别出你是什么类型的东西,以便可以发送适当的响应。
例如,如果您从 Big Sur 上 Mac 上的 Safari 请求,用户代理可能是:
“Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15”
而在 iPad 上它可能是:
“Mozilla/5.0(iPad;CPU OS 14_7_1,如 Mac OS X)AppleWebKit/605.1.15(KHTML,如 Gecko)版本/14.1.2 Mobile/15E148 Safari/604.1”
为请求提供服务的站点使用用户代理来确定要返回的响应类型以及要包含的功能(完整站点、移动站点、文本站点等)。
对于 Swift 应用程序中的 URLSession,用户代理是应用程序的包名称。因此,该网站可能会对此感到困惑,并返回与您在浏览器中访问时看到的不同的内容。
一些选项:
探索该站点,它可能有一个更好的 URL 可用于获取您所追求的信息。
更改您发送的用户代理字符串。基本步骤是:
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["User-Agent": "User-Agent String Here"]
let session = URLSession(configuration: config)
您可能需要调整您对共享会话的使用以支持这一点(例如:使用您的配置创建一个会话并使用它,如上所述,或者检查是否有一种方法可以使用共享会话覆盖您的请求的标头) .
推荐阅读
- webrtc - WebRTC再次删除Stream和addStream的正确方法是什么
- messagebroker - IBM IIB 或 ACE :: 如何在 Java 计算节点或任何节点中访问 Security Identity 或 Vault 详细信息
- javascript - Json 响应为空 - Spotify API
- c# - 使用自定义格式将类对象序列化为 JSON
- arrays - 问题从 tableview 选择构建正确的数组
- android - android,带有标签的通知在哪里:ranker_group fom
- c++ - 您如何读取/记录 gRPC HTTP 标头(不是自定义元数据)?
- java - 使用 JMS 进行 Camel Spring 远程处理 - 不明确的方法调用
- sendy - Sendy(由 Hostinger 托管)电子邮件活动不断超时
- google-api - 使用 Python 和 Google People API 删除“其他联系人”