在swift中parsinghtml的最佳实践是什么?

我是一个Swift新手。 我需要在Swift iOS项目中使用Python的BeautifulSoup。 准确地说,我需要获得以".txt"结尾的<a>所有href 。 我应该采取什么措施?

有几个很好的使用SwiftObjective-C进行HTMLparsing的库,如下所示:

  • hpple
  • NDHpple
  • Kanna(旧的Swift-HTML-Parser)
  • 附子
  • SwiftSoup

看看上面提到的四个库中的以下示例,主要使用XPath 2.0进行parsing:

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和CSSselect器)

 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和CSSselect器)

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

ends-with函数是Xpath 2.0的一部分。

SwiftSoup(CSSselect器)

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

我希望这可以帮助你。

你可以试试这个swift-html-parser:

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

它帮助了很多。

为了让你的HTML从TXT你可以:

 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) 

编辑:

为了得到你需要的东西,你可以用它作为例子:

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

试试SwiftSoup ,Swift的一个jsoup的端口。

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