2015-06-26 16 views

Odpowiedz

63

Istnieje kilka ładne biblioteki z HTML Parsing przy użyciu Swift i Objective-C, podobnie jak następujące:

Spójrz w poniższych przykładach w czterech bibliotekach zamieszczonych powyżej, głównie analizowana z wykorzystaniem 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 i CS selektory):

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) 
     } 
    } 
} 

fuži (xPath i CS selektorów):

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) 
} 

Funkcja ends-with jest częścią Xpath 2.0.

SwiftSoup (selektory 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") 
} 

Mam nadzieję, że to pomaga.

+2

.. nazwa "Swift-HTML-Parser" to teraz Kanna (鉋) –

+2

@FrancoRondini Dzięki za obserwację, odpowiedź na bieżąco :) –

+0

Dostaję "niejednoznaczne użycie init (HTMLData:)" przez cały czas. Próbowałem bawić się z 'as!' I ':' i wszystkim, ale nie mogę tego uruchomić. Jakieś pomysły? Nienawidzę szybkiego – user2161301

4

można spróbować tej SWIFT-parser HTML:

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

To bardzo pomaga.

I coraz HTML z txt można:

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:

Aby uzyskać to, czego potrzeba można użyć jako exemple:

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

Dziękuję. Nie muszę wyodrębniać html z txt. Potrzebuję wyodrębnić .txt hrefs z html przez twój parser: 'Da TXT -> http: // foo.com/bar.txt' – amazingbasil

+0

@amazingbasil Zmontowałem swoją odpowiedź, mam nadzieję, że ci to pomoże. :) –

3

Wypróbuj SwiftSoup, port jsoup do 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

Dobra robota, Dokumentacja może być trochę jasne. Aktualne informacje nie wystarczą, aby zacząć. Jak wykonać Akcje za pomocą obiektu dokumentu i za pomocą formularzy będzie świetnym początkiem –

+0

@m Inna dokumentacja znajduje się w sekcji Wiki, ale ja ją piszę. – Scinfu

+0

@Scinfu: Czy obsługuje Swift 2? – user484691

Powiązane problemy