2015-05-14 3 views
2

Я пытаюсь привести эту информацию с веб-страницы в приложение iOS.Swift parse html table

HTML код:

<table border="0" cellpadding="3" cellspacing="0" width="85%"><tr><td width="100%" colspan="3" bgcolor="#C9C9E7"><b>Update as of 3:57:00 PM (CDT) Thu., Apr. 16, 2015</b><br></td></tr><tr> 
<td width="50%" bgcolor="#FFFFFF">Production Line 1</td> 
<td width="35%" bgcolor="#FFFFFF">9:00 minutes (10 min)&nbsp;</td> 
<td width="15%" bgcolor="#FFFFFF">No delay</td> 
</tr><tr> 
<td width="50%" bgcolor="#FFFFFF"><b>Production Line 2</b></td> 
<td width="35%" bgcolor="#FFFFFF"><b>7:57 minutes </b><b>(4 min)&nbsp;</b></td> 
<td width="15%" bgcolor="#FFFFFF"><b>+3:57</b></td> 
</tr><tr> 
<td width="50%" bgcolor="#FFFFFF"><b>Production Line 3</b></td> 
<td width="35%" bgcolor="#FFFFFF"><b>10:35 minutes </b><b>(8 min)&nbsp;</b></td> 
<td width="15%" bgcolor="#FFFFFF"><b>+2:35</b></td> 
</tr></table> 

Это моя текущая попытка кода. Я отметил строку, которая, по моему мнению, является проблемой // проблемы. Я получаю только необязательные значения nil. Я использую Swift-HTML-Parser, чтобы это произошло. Я сделал только одно изменение, и это должно было добавить раздел для таблицы.

import UIKit 
extension String { 
var html2String:String { 
    return NSAttributedString(data: dataUsingEncoding(NSUTF8StringEncoding)!, options: [NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute:NSUTF8StringEncoding], documentAttributes: nil, error: nil)!.string 
    } 
} 

class mainViewController: UIViewController { 

@IBOutlet var textView: UITextView! 


override func viewDidLoad() { 
    super.viewDidLoad() 
    updateTrafficInfo() 

    let singleFingerTap = UITapGestureRecognizer(target: self, action: "handleSingleTap:") 
    self.textView.addGestureRecognizer(singleFingerTap) 
} 

// MARK: gestutre recognizer 
func handleSingleTap(recognizer: UITapGestureRecognizer) { 
    updateTrafficInfo() 
} 

func updateTrafficInfo(){ 
    var request = HTTPTask() 
    var err: NSError? 
    request.GET("http://localhost/productiontimes.html", parameters: nil, success: {(response: HTTPResponse) in 
     if let data = response.responseObject as? NSData { 
      let rawHTML = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 
      let option = CInt(HTML_PARSE_NOERROR.value | HTML_PARSE_RECOVER.value) 

      var parser = HTMLParser(html: rawHTML, encoding: NSUTF8StringEncoding, option: option, error: &err) 
      if err != nil { 
       println(err) 
      } 
      var bodyNode = parser.table 
      if let inputNodes = bodyNode?.xpath("//tr") { 
       for node in inputNodes { 
        dispatch_sync(dispatch_get_main_queue(), { 
        self.textView.text = node.xpath("//td")?[0].contents //issue 
        println(node.xpath("//td")?[0].contents) 
        }); 
       } 
      } 


      dispatch_sync(dispatch_get_main_queue(), { 
       self.textView.text = rawHTML.html2String 


      }); 

     } 
     },failure: {(error: NSError, response: HTTPResponse?) in 
      println("error: \(error)") 
    }) 
} 



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


} 

Цель состоит в том, чтобы результат был получен в формате чего-то подобного.

Production Line -  Time -      Delay 
Production Line 1 -  9:00 minutes (10 min) - No delay 
Production Line 2 -  7:57 minutes (4 min) -  +3:57 
+0

И у вас действительно нет другой возможности получить данные? HTML - это не обменный формат, а язык разметки для компоновки и отображения содержимого. По моему опыту, синтаксический анализ HTML с любого сайта (даже вашего собственного) - это боль в a .. потому что каждый дизайн-дизайн путает ваш импорт. – gutenmorgenuhu

+0

Нет, я этого не делаю, и я бы хотел, макет html не изменится. Я был бы рад, если кто-то может помочь преобразовать его cvs, xml или что-то, что я могу положить в таблицу. – MwcsMac

+0

Я видел это расширение :) –

ответ

2
extension NSData { 
    var htmlData2String:String { 
     return NSAttributedString(data: self, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute : NSUTF8StringEncoding], documentAttributes: nil, error: nil)!.string 
    } 
} 

let output = data.htmlData2String 
let components = output.componentsSeparatedByString("\n") 
for index in stride(from: 1, to: 9, by: 3) { 
    let line = components[index] 
    let time = components[index+1] 
    let delay = components[index+2] 
    println(line + " - " + time + " - " + delay) 
} 
+1

Хотел бы я отметить как правильный ответ. Мне нравятся оба метода. – MwcsMac

2

У вас есть некоторые проблемы в вашем XPath см следующий код:

let html = "<table border='0' cellpadding='3' cellspacing='0' width='85%'><tr><td width='100%' colspan='3' bgcolor='#C9C9E7'><b>Update as of 3:57:00 PM (CDT) Thu., Apr. 16, 2015</b><br></td></tr><tr>" + 
     "<td width='50%' bgcolor='#FFFFFF'><b>Production Line 1</b></td>" + 
     "<td width='35%' bgcolor='#FFFFFF'><b>9:00 minutes</b><b>(10 min)&nbsp;</b></td>" + 
     "<td width='15%' bgcolor='#FFFFFF'><b>No delay</b></td>" + 
     "</tr><tr>" + 
     "<td width='50%' bgcolor='#FFFFFF'><b>Production Line 2</b></td>" + 
     "<td width='35%' bgcolor='#FFFFFF'><b>7:57 minutes </b><b>(4 min)&nbsp;</b></td>" + 
     "<td width='15%' bgcolor='#FFFFFF'><b>+3:57</b></td>" + 
     "</tr><tr>" + 
     "<td width='50%' bgcolor='#FFFFFF'><b>Production Line 3</b></td>" + 
     "<td width='35%' bgcolor='#FFFFFF'><b>10:35 minutes </b><b>(8 min)&nbsp;</b></td>" + 
     "<td width='15%' bgcolor='#FFFFFF'><b>+2:35</b></td>" + 
    "</tr></table>" 



    var err : NSError? 
    var parser = HTMLParser(html: html, error: &err) 
    if err != nil { 
     println(err) 
     exit(1) 
    }   

    var table = parser.html 

    // avoid the first <td> tag 
    if let inputNodes = table?.xpath("//td[position() > 1]/b") { 

     println("Production Line -  Time -      Delay")    
     for (index, node) in enumerate(inputNodes) { 
      if index % 4 == 0 { 
       println("\n") 
      } 
      print(node.contents + "- ") 
     } 
    } 

Выход следующее:

Production Line -  Time -      Delay 

Production Line 1- 9:00 minutes- (10 min) - No delay-  

Production Line 2- 7:57 minutes - (4 min) - +3:57-  

Production Line 3- 10:35 minutes - (8 min) - +2:35- 

Вы можете настроить вывод, как вы хотеть. Надеюсь, это поможет вам.

+1

Хотел бы я отметить как правильный ответ. Мне нравятся оба метода. – MwcsMac

+0

jajjaja Хороший конкурс –