2015-06-26 20 views

Trả lời

63

Có một số thư viện tốt đẹp của HTML Parsing sử dụng SwiftObjective-C như sau:

Hãy xem trong các ví dụ sau đây trong bốn thư viện được đăng trên đây, chủ yếu là phân tích cú pháp sử dụng XPath 2.0:

hpple:

let data = NSData(contentsOfFile: path) 
let doc = TFHpple(htmlData: data) 

if let elements = doc.searchWithXPathQuery("//a/@href[ends-with(.,'.txt')]") as? [TFHppleElement] { 
    for element in elements { 
     println(element.content) 
    } 
} 

NDHpple:

let data = NSData(contentsOfFile: path)! 
let html = NSString(data: data, encoding: NSUTF8StringEncoding)! 
let doc = NDHpple(HTMLData: html) 
if let elements = doc.searchWithXPathQuery("//a/@href[ends-with(.,'.txt')]") { 
    for element in elements { 
    println(element.children?.first?.content) 
    } 
} 

Kanna (XPath và CSS Selectors):

let html = "<html><head></head><body><ul><li><input type='image' name='input1' value='string1value' class='abc' /></li><li><input type='image' name='input2' value='string2value' class='def' /></li></ul><span class='spantext'><b>Hello World 1</b></span><span class='spantext'><b>Hello World 2</b></span><a href='example.com'>example(English)</a><a href='example.co.jp'>example(JP)</a></body>" 

if let doc = Kanna.HTML(html: html, encoding: NSUTF8StringEncoding) { 
    var bodyNode = doc.body 

    if let inputNodes = bodyNode?.xpath("//a/@href[ends-with(.,'.txt')]") { 
     for node in inputNodes { 
     println(node.contents) 
     } 
    } 
} 

Fuzi (XPath và CSS Selectors):

let html = "<html><head></head><body><ul><li><input type='image' name='input1' value='string1value' class='abc' /></li><li><input type='image' name='input2' value='string2value' class='def' /></li></ul><span class='spantext'><b>Hello World 1</b></span><span class='spantext'><b>Hello World 2</b></span><a href='example.com'>example(English)</a><a href='example.co.jp'>example(JP)</a></body>" 

do { 
    // if encoding is omitted, it defaults to NSUTF8StringEncoding 
    let doc = try HTMLDocument(string: html, encoding: NSUTF8StringEncoding) 

    // XPath queries 
    for anchor in doc.xpath("//a/@href[ends-with(.,'.txt')]") { 
    print(anchor.stringValue) 
    } 

} catch let error { 
    print(error) 
} 

Chức năng ends-with là một phần của Xpath 2.0.

SwiftSoup (Selectors CSS):

do{ 
    let doc: Document = try SwiftSoup.parse("...") 
    let links: Elements = try doc.select("a[href]") // a with href 
    let pngs: Elements = try doc.select("img[src$=.png]") 

    // img with src ending .png 
    let masthead: Element? = try doc.select("div.masthead").first() 

    // div with class=masthead 
    let resultLinks: Elements? = try doc.select("h3.r > a") // direct a after h3 
} catch Exception.Error(let type, let message){ 
    print(message) 
} catch { 
    print("error") 
} 

Tôi hy vọng điều này sẽ giúp bạn.

+2

.. tên của "Swift-HTML-Parser" bây giờ là Kanna (鉋) –

+2

@FrancoRondini Cảm ơn bạn đã quan sát, trả lời cập nhật :) –

+0

Tôi nhận được 'sử dụng không rõ ràng của init (HTMLData:)' mọi lúc. Cố gắng rối tung xung quanh với 'như!' Và ':' và tất cả mọi thứ nhưng tôi không thể làm cho nó hoạt động. Bất kỳ ý tưởng? Tôi ghét swift – user2161301

4

Bạn có thể thử nhanh chóng-html-phân tích cú pháp này:

https://github.com/tid-kijyun/Swift-HTML-Parser

Nó sẽ giúp rất nhiều.

Và để nhận html của bạn từ một txt bạn có thể:

let file = "file.txt" 

if let dirs : [String] = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true) as? [String] { 
    let dir = dirs[0] //documents directory 
    let path = dir.stringByAppendingPathComponent(file); 
    let html = String(contentsOfFile: path, encoding: NSUTF8StringEncoding, error: nil) 

Edit:

Để có được những gì bạn cần bạn có thể sử dụng như là dụ:

import Foundation 

let html = "theHtmlYouWannaParse" 

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

var bodyNode = parser.body 

if let inputNodes = bodyNode?.findChildTags("b") { 
    for node in inputNodes { 
     println(node.contents) 
    } 
} 

if let inputNodes = bodyNode?.findChildTags("a") { 
    for node in inputNodes { 
     println(node.getAttributeNamed("href")) //<- Here you would get your files link 
    } 
} 
+0

Cảm ơn bạn. Tôi không cần trích xuất html từ txt. Tôi cần trích xuất .txt hrefs từ html qua trình phân tích cú pháp của bạn: 'Da TXT -> http: // foo.com/bar.txt' – amazingbasil

+0

@amazingbasil Tôi đã chỉnh sửa câu trả lời của mình, hy vọng nó sẽ giúp bạn ngay bây giờ. :) –

3

Hãy thử SwiftSoup, một cổng jsoup để Swift.

let html: String = "<a id=1 href='?foo=bar&mid&lt=true'>One</a> <a id=2 href='?foo=bar&lt;qux&lg=1'>Two</a>"; 
    let els: Elements = try SwiftSoup.parse(html).select("a"); 
    for element: Element in els.array(){ 
     print(try element.attr("href")) 
    } 
+0

Công việc tốt, Tài liệu có thể hơi rõ ràng. Thông tin hiện tại không chỉ đủ để bắt đầu. Làm thế nào để thực hiện Hành động thông qua đối tượng tài liệu và sử dụng biểu mẫu sẽ là một khởi đầu tuyệt vời –

+0

@m Các tài liệu khác là trên phần Wiki nhưng tôi đang viết nó. – Scinfu

+0

@Scinfu: Nó có hỗ trợ Swift 2 không? – user484691

Các vấn đề liên quan