首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用SwiftSoup进行分析时,url数据任务没有显示正确的内容吗?Swift 5

当使用SwiftSoup进行分析时,url数据任务没有显示正确的内容吗?Swift 5
EN

Stack Overflow用户
提问于 2021-08-18 06:26:44
回答 2查看 63关注 0票数 0

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

我想我的问题是:有没有办法加载内容,就像我手动搜索这个网站时出现的那样?

相关代码如下:

代码语言:javascript
复制
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")
    }
                
}

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-19 11:14:52

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

代码语言:javascript
复制
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加载网站,然后在延迟后解析数据是一种可行的解决方案。有一个固定的延迟可能不是最好的主意,所以如果有任何其他的建议,将不胜感激!

票数 0
EN

Stack Overflow用户

发布于 2021-08-18 10:42:35

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

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

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

Mozilla/5.0 (Macintosh;英特尔Mac OS X 11_5_2) AppleWebKit/605.1.15 (KHTML,如Gecko)版本/14.1.2 Safari/605.1.15

而在iPad中,它可能是:

"Mozilla/5.0 (iPad;CPU OS 14_7_1,如Mac ) AppleWebKit/605.1.15 (KHTML,如Gecko)版本/14.1.2 Mobile/15E148 Safari/604.1“

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

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

一些选项:

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

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

代码语言:javascript
复制
let config = URLSessionConfiguration.default
config.httpAdditionalHeaders = ["User-Agent": "User-Agent String Here"]
let session = URLSession(configuration: config)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68827477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档