あるサイトからKannaを使ってスクレイピングしてデータ収集をしようとしています。
しかし。下記のコードの中で**'HTMLDocument' cannot be constructed because it has no accessible initializers**というエラーが出現し困っております。
解決策ご存知の方、教えていただければ嬉しいです。よろしくお願いします。
swift
1import UIKit 2import Kanna 3 4class event 5{ 6 var name = "" 7 var importance = "" 8 var range: Double = 0 9 var previous_rate: Double = 0 10 var expectation: Double = 0 11 var result: Double = 0 12} 13 14class FirstViewController: UIViewController { 15 16 /// 今日のデータArray 17 var todayData: [event] = [] 18 19 var activityindicator = UIActivityIndicatorView() 20 21 @IBOutlet weak var update_button: UIButton! 22 @IBOutlet weak var textView: UITextView! 23 24 override func viewDidLoad() { 25 super.viewDidLoad() 26 } 27 28 #更新ボタン 29 @IBAction func buttonTapped(_ sender: Any) 30 { 31 self.excute() 32 } 33 34 func excute() 35 { 36 self.activityindicator.startAnimating() 37 38 let group = DispatchGroup() 39 let queue1 = DispatchQueue(label: "hoge.fuga.queue1") 40 41 // キューとグループを紐付ける 42 queue1.async(group: group) 43 { 44 // 今日 45 guard let url = URL(string: "ユーアールエル") else 46 { 47 fatalError("Error: URL") 48 } 49 let data = self.getHtml(url: url) 50 self.todayData = self.parseHtml(name: "today", data: data) 51 } 52 // タスクが全て完了したらメインスレッド上で処理を実行する 53 group.notify(queue: DispatchQueue.main) 54 { 55 // 編集してUITextViewに表示 56 var s = "" 57 for e in self.todayData 58 { 59 s += e.name + "-" + e.importance + "I: " + String(e.range) + "R: " + String(e.previous_rate) + "PR: " + String(e.expectation) + "E: " 60 + String(e.result) + "Re: " 61 } 62 self.textView.text = s 63 self.activityindicator.stopAnimating() 64 } 65 66 } 67 /// HTML取得 68 func getHtml(url: URL) -> Data { 69 do { 70 return try Data(contentsOf: url) 71 } catch { 72 fatalError("fail to download") 73 } 74 } 75 /// スクレイピング 76 func parseHtml(name: String, data: Data) -> [event] { 77 // KannaでHTMLDocumentを生成 78 //ここにエラー、'HTMLDocument' cannot be constructed because it has no accessible initializersが出ます。 79 guard let doc = try! HTMLDocument(html: data, encoding: String.Encoding.utf8) else 80 { 81 fatalError("Error: HTML") 82 } 83 var retData: [event] = [] 84 // HTMLの<table>の時刻の列を基準にLoopし、該当行の気温の列をKannaでスクレイピング 85 for i in (1...24) { 86 let node = doc.xpath("//*[@id='tbl_list']//tr[td[1][text()='(i)']]/td[2]") 87 if let nodeFirst = node.first, let content = nodeFirst.content, let value = Double(content) { 88 // 値が入っている場合のみ取得 89 let e = event() 90 e.name = String() 91 e.importance = value 92 e.range = value 93 e.previous_rate = value 94 e.expectation = value 95 e.result = value 96 retData.append(e) 97 } 98 } 99 return retData 100 } 101 102} 103 104
使い方を見ると、HTML()でインスタンス生成するのでは?
https://github.com/tid-kijyun/Kanna
HTMLDocumentだとエラーの通りそんな方に初期化できんということなのでは?
回答1件
あなたの回答
tips
プレビュー