Swift HTML Parser

时间:2015-11-16 00:51:09

标签: html swift parsing

我无法将输出发布到标签上。我必须把它变成一个字符串?它似乎给我的错误是“不能下标一个类型为JiNode的值?带有'Int'类型的索引”请帮忙!

var meter = ""

@IBAction func calculate(sender: AnyObject) {
    print("start scraping...")

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {

        let url = NSURL(string: "http://uberestimate.com/costs.php")
        let jiDoc = Ji(htmlURL: url!)


        if jiDoc != nil {
            print("html retrived.\n")
            self.scrapeHTML(jiDoc!)
        }
    }

}
@IBOutlet weak var resultLabel: UILabel!
@IBOutlet weak var endingPoint: UITextField!
@IBOutlet weak var startingpoint: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

private func scrapeHTML(jiDoc: Ji) {
    println("parsing...\n")
    let bodyNode = jiDoc.xPath("//body")!.first!

    var contentDivNode = bodyNode.xPath("//span[@style='font-size:1.3em']").first

    if contentDivNode == nil {
        print("unexpected format!")

    }else{
        var cdnArray = contentDivNode[1]

        var cdn = cdnArray[0]! as String

        self.resultLabel.text = cdn

      //  println(contentDivNode)
    }
return

}

}

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

@IBAction func calculate(sender: AnyObject) {
    print("start scraping...")

    let url = NSURL(string: "http://uberestimate.com/costs.php")

    let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { data, response, error in
        if data == nil || error != nil {   // in Swift 2, I'd use `guard`, but I tried to keep this backward compatible
            print(error)
            return
        }

        dispatch_async(dispatch_get_main_queue()) {
            self.scrapeHTML(data!)
        }
    }
    task.resume()
}

private func scrapeHTML(data: NSData) {
    print("parsing...\n")

    let jiDoc = Ji(data: data, isXML: false)

    if let contentDivNode = jiDoc?.xPath("//span[@style='font-size:1.3em']")?.first {
        self.resultLabel.text = contentDivNode.content
    }
}

我正在使用Swift 2.1(我从println的存在推断你必须使用早期版本),但我认为无论Swift版本如何,这都基本相同。

BTW,请注意我将标签的更新发送回主队列(正如您从全局队列调用scrapeHTML,但UI更新必须在主线程上发生)。我也使用NSURLSession而不是将同步网络请求分派给全局队列。