【问题标题】:Web scraping in apple swift 3苹果 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)

【问题讨论】:

    标签: swift3 swift-playground


    【解决方案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 字符,或者,很可能,他们故意在页面以阻止新手抓取它)。您当然可以在继续解析之前手动扫描并修复/删除有问题的字符。但我敢打赌,出现这种行为的页面也有禁止抓取的服务条款(许多商业网站都这样做),所以你可能想检查一下。重新保存,查看修改后的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2018-09-29
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多