苹果 swift 3 中的网页抓取

Posted

技术标签:

【中文标题】苹果 swift 3 中的网页抓取【英文标题】:Web scraping in apple swift 3 【发布时间】:2017-01-07 02:02:48 【问题描述】:

我是 Swift 初学者,我正在尝试弄清楚如何从网络文章中检索文本、创建新文本文件并将文本数据保存到其中(使用 Swift Playgrounds)。这可能吗?

我能在网上找到的关于这个主题的唯一内容就是这个,而且我认为它甚至不是为 Swift 3 编写的:

附:如果我的问题需要更多详细信息,请告诉我而不是搁置。谢谢!

import Cocoa

var url = NSURL(string: "http://finance.yahoo.com/news/tv-news-ces-2017-120931816.html")

if url != nil 

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler:  (data, response, error) -> Void in

        print(data)

        if error == nil 

            var urlContent = NSString(data: data, encoding: NSUTF8StringEncoding) as NSString!

            print(urlContent)

【问题讨论】:

【参考方案1】:

这是 Swift 2.3。在 Swift 3 中使用URL 代替NSURL 并使用URLSession 而不是NSURLSession 等等。你也可以使用String 而不是NSString。例如

let url = URL(string: "http://finance.yahoo.com/news/tv-news-ces-2017-120931816.html")!

let task = URLSession.shared.dataTask(with: url)  data, response, error in
    guard let data = data, error == nil else 
        print("\(error)")
        return
    

    let string = String(data: data, encoding: .utf8)

    print("\(string)")


task.resume()

如果您要在操场上执行此操作,请记住这是异步运行的,因此您需要设置 needsIndefiniteExecution

import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

要实际解析 HTML,您应该考虑使用 HTML 解析器,例如 TFHpple(用 Objective-C 编写,但在 Swift 中仍然可以很好地工作)或 NDHpple(我没有的 Swift 版本)与 TFHpple 一样有信心,但可能会正常工作)。

您可能想查看How to Parse HTML on ios。它已过时,但会引导您了解概念(确保您没有违反网站的 ToS、如何使用解析器等)。


如果要将其保存到文件中,可以执行以下操作:

let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
    .appendingPathComponent("test.dat")
try! data.write(to: fileURL)

你可以使用任何你想要的文件扩展名。

【讨论】:

对于某些网站,它返回 nil。为什么会这样? 另外,是否可以将数据写入新的 textEdit 文件?谢谢! 它可能是nil,如果它不是有效的 UTF8(设计为使用另一种编码,意外地包含非 UTF8 字符,或者,很可能,他们故意在页面以阻止新手抓取它)。您当然可以在继续解析之前手动扫描并修复/删除有问题的字符。但我敢打赌,出现这种行为的页面也有禁止抓取的服务条款(许多商业网站都这样做),所以你可能想检查一下。重新保存,查看修改后的答案。

以上是关于苹果 swift 3 中的网页抓取的主要内容,如果未能解决你的问题,请参考以下文章

如何抓取网页中的动态数据

Swift 中的 iOS 共享扩展抓取 URL

从网站抓取数据的3种最佳方法

如何使用JAVA语言抓取某个网页中的邮箱地址

python怎样抓取网页中的文字和数字数据

请教网页里的特定数据怎么抓取?