LoginSignup
3
3

More than 5 years have passed since last update.

mac用HTMLパースライブラリを作りました。

Last updated at Posted at 2017-06-22

製作理由など

趣味で作っている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のコピーについていい案がありましたら教えていただけいる幸いです。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3