我正在尝试将此信息从网页转换为iOS应用。
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) </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) </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) </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 :(得分:3)
编辑/更新:Swift 4.x
extension Data {
var html2AttributedString: NSAttributedString? {
return try? NSAttributedString(data: self, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
}
var html2String: String {
return html2AttributedString?.string ?? ""
}
}
let data = Data("""
<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) </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) </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) </b></td>
<td width="15%" bgcolor="#FFFFFF"><b>+2:35</b></td>
</tr></table><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) </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) </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) </b></td>
<td width="15%" bgcolor="#FFFFFF"><b>+2:35</b></td>
</tr></table>
""".utf8)
let output = data.html2String
let components = output.components(separatedBy: .newlines)
for index in stride(from: 1, to: 9, by: 3) {
let line = components[index]
let time = components[index+1]
let delay = components[index+2]
print( line + " - " + time + " - " + delay )
}
答案 1 :(得分: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) </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) </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) </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-
您可以根据需要个性化输出。我希望这对你有帮助。