苹果 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 中的网页抓取的主要内容,如果未能解决你的问题,请参考以下文章