製作理由など
趣味で作っているmacアプリにおいてWebページのパースが必要になったため
Cのライブラリをブリッジしました。
メモリリークなどバグがあればコメントにお願いします。
またスキームを追加すればiOS,tvなどでも使えるはずです。
今Gitにつながらないので一旦こっちに
https://drive.google.com/open?id=0BwMN9FfQw1aoZlRJUDRsSmJaTXM
(PC復旧したらあげ直します。)
使用例
let htmlString =
"""
<html>
<head>
<title>Title</title>
</head>
<body>
<div class = \"box\",id = \"main_box\">
Hello World
</div>
</body>
</html>
"""
let html = HTML(string: htmlString)
let title = html.nodes(at: "head/title").first?.string //Title
let divNode = html.nodes(at: "body/div/div")[0]
let attributes = divNode.attributes //["class":"box","id":"main_box"]
let value = divNode.string //Hello World
let content = divNode.content //<div class = "box",id = "main_box">\nHello World\n</div>
let tag = divNode.tag //div
HTMLのfunc nodes(at xpath:String)->HTML
はXMLのXpathです。
Xpathについては
http://qiita.com/merrill/items/aa612e6e865c1701f43b
に詳しく説明があります。
構造
すべでget onlyです。
class HTML {
var tag: String? //Nodeのタグ divとかh1とか
var children: [HTML] //自身の直下にあるNodes
var parent: HTML? //自身の直上にあるNode
var content: String? //要素を含めたコンテンツ
var string: String? //要素を含めないコンテンツ
var attributes: [String : String] // class,id など
func nodes(at path: String) -> [HTML] //Xpathによって指定されたNodes
init(data: Data, encoding: String.Encoding = default) //default Encoding は utf8
}
extension HTML {
var stringValue: String //stringがnil なら から文字列
subscript(key: String) -> String? //attributes[key] と同値
convenience init(string: String) //Stringからのコンストラクタ、一度データに変換するため少し非効率
}
またEquatable,CustomStringConvertible,NSCopying
に批准しています。
本当はStructとして実装したかったがCのポインタのコピーのタイミングがわからなかったので、
NSCopyingのcopy()で複製可能に
structのコピーについていい案がありましたら教えていただけいる幸いです。