ポジティブ丸メガネ

3年目エンジニアです。

Swift:HTMLをParseする方法(WEBスクレイピング)

環境:XCode 7 Beta、Swift2

XMLのパース

XML形式になっているサイトをパースするのは、下記サイトを参考にすれば簡単でした。ちょこちょこっとSwift2仕様に書き換えましたが。blog.andgenie.jp

ただ、自分がやりたかったのは、XML形式になっていないただのWEBサイトの中から必要な情報を取り出すことでした。NSXMLParserでは、部分しか取得することができず、断念。

HTML(非XML)のパース

調べていると、全部HTMLを取ってきて自分で解析してしまえという以下の記事を見つけましたが、もっと楽したい…。zenmai.biz

さらに調べていると、あるじゃありませんか。自分で取ってきたHTMLデータを解析しやすくするライブラリが。qiita.com

今回はこれを活用させてもらうことにしました。とりあえずGitからクローンしてきて、そのプロジェクトを起動すると、「新しいSwiftの記法に変換しますか」的なことを聞かれたので、とりあえず変換。そして、GitのReadmeの通りに、必要なファイルと設定を自分のプロジェクトに適用します。

ただ、XCode 7 Betaでは、.dylib拡張子のバイナリが見つからないんですよね。それについて調べてみると、以下の設定をすれば.tbd拡張子のバイナリでうまく動作するようです。以下引用は記事を日本語にしただけ。

プロジェクトのBuild Settingsを開いて、Frameworks Search Pathに $(PROJECT_DIR) を追加して、recursiveオプションを選択する。

stackoverflow.com
これでインポートしたライブラリがうまく動作するようになりました。

あとは、本当にGitに書いてあるとおりに使えば大丈夫でした。
ただExampleには書いてなかったfindChildTagAttr()の使い方は以下の様な感じです。

if let inputNodes = bodyNode?.findChildTagAttr("div", attrName: "class", attrValue: "クラス名"){
    for node in inputNodes {
        println(node.contents)
    }
}

あとは、階層的に掘り下げていきたければ、inputNodesに対して再度findChildTagをしてあげると掘り下げて行けましたが、うまくいかないところもあったので、よくわからないです。ライブラリのソースを読まないとダメですね。