★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-tjoawdct-ma.html
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★css
目錄:[Swift]通天遁地Swifthtml
本文將演示使用Fuzi(斧子)類庫實現對XML和HTML文檔的快速解析。ios
首先確保在項目中已經安裝了所需的第三方庫。git
點擊【Podfile】,查看安裝配置文件。github
1 platform :ios, '12.0' 2 use_frameworks! 3 4 target 'DemoApp' do 5 source 'https://github.com/CocoaPods/Specs.git' 6 pod 'Fuzi' 7 end
根據配置文件中的相關配置,安裝第三方庫。swift
而後點擊打開【DemoApp.xcworkspace】項目文件。安全
在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】微信
1 import UIKit 2 //引入已經安裝的第三方類庫 3 import Fuzi 4 5 class ViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view, typically from a nib. 10 //實現對XML文檔的解析 11 parseXML() 12 //實現對HTML文檔的解析 13 parseHTML() 14 } 15 16 //添加一個方法,實現對XML文檔的解析 17 func parseXML() 18 { 19 //從項目中讀取指定文件名稱的待解析的文檔。 20 let fileUrl = URL(fileURLWithPath: ((#file as NSString).deletingLastPathComponent as NSString).appendingPathComponent("nutrition.xml")) 21 //添加一個異常捕捉語句,用來處理對XML文檔的解析操做。 22 do 23 { 24 //讀取待解析的文檔,並存儲在一個數據常量中。 25 let data = try Data(contentsOf: fileUrl) 26 //將加載的數據轉換成文檔對象。 27 let document = try XMLDocument(data: data) 28 29 //得到文檔對象的根節點,並在控制檯輸出根節點的標籤的值。 30 if let root = document.root 31 { 32 //輸出日誌信息 33 print("Root Element: \(String(describing: root.tag))") 34 35 print("\nDaily values:") 36 //得到根節點中指定標籤的節點, 37 //而後得到該節點下的全部子節點, 38 //並對子節點進行遍歷。 39 for element in root.firstChild(tag: "daily-values")?.children ?? [] 40 { 41 //得到節點標籤的名稱 42 let nutrient = element.tag 43 //得到節點的值 44 let amount = element.numberValue 45 //得到節點屬性的值 46 let unit = element["units"] 47 //在控制檯輸出節點各元素的值 48 print("- \(amount!)\(unit!) \(nutrient!)") 49 } 50 //輸出一個換行符 51 print("\n") 52 53 //經過X路徑格式,得到指定的節點。 54 //這裏得到食物節點下的名稱子節點。 55 var xpath = "//food/name" 56 //在控制檯輸出該節點。 57 print("XPath Search: \(xpath)") 58 59 //遍歷全部的名稱節點 60 for element in document.xpath(xpath) 61 { 62 //並在控制檯輸出食物的名稱 63 print("\(element)") 64 } 65 //輸出另外一個換行符 66 print("\n") 67 68 //還能夠經過和CSS類似的方法,來查找指定的節點。 69 //這裏得到食物節點下的指定的子節點。 70 let css = "food > serving[units]" 71 //初始化一個文檔元素 72 var blockElement:XMLElement? = nil 73 //在控制檯輸出搜索路徑 74 print("CSS Search: \(css)") 75 76 //對指定路徑下的節點進行遍歷 77 for (index, element) in document.css(css).enumerated() 78 { 79 //當循環的索引爲數字1時, 80 if index == 1 81 { 82 //得到遍歷的節點。 83 blockElement = element 84 break 85 } 86 } 87 //而後在控制檯輸出第二個節點。 88 print("Second element: \(blockElement!)\n") 89 90 //在控制檯輸出食物節點下的,名稱子節點的X路徑。 91 xpath = "//food/name" 92 print("XPath Search: \(xpath)") 93 94 //得到文檔中的指定路徑的第一個節點, 95 //在控制檯輸出該節點的內容。 96 let firstElement = document.firstChild(xpath: xpath)! 97 print("First element: \(firstElement)") 98 } 99 } 100 catch 101 { 102 print("Something went wrong :(") 103 } 104 } 105 106 //添加一個方法,實現對HTML文檔的解析 107 func parseHTML() 108 { 109 //從項目中讀取指定的網頁文件 110 let fileUrl = URL(fileURLWithPath: ((#file as NSString).deletingLastPathComponent as NSString).appendingPathComponent("index.html")) 111 //添加一個異常捕捉語句,用來處理對HTML文檔的解析操做。 112 do 113 { 114 //得到指定位置的網頁文件,將文件存儲在數據對象中。 115 let data = try Data(contentsOf: fileUrl) 116 //將網頁數據轉換成文檔對象。 117 let doc = try HTMLDocument(data: data) 118 119 //得到文檔對象中的第一個指定的節點, 120 if let elementById = doc.firstChild(css: "#copyright") 121 { 122 //並在控制檯輸出該節點的內容。 123 print(elementById.stringValue) 124 } 125 126 //得到文檔對象中的全部連接節點, 127 //並對連接節點進行遍歷 128 for link in doc.css("a, link") 129 { 130 //在控制檯輸出連接的路徑 131 print(link.rawXML) 132 print(link["href"] as Any) 133 } 134 135 //得到主體節點下的全部連接節點, 136 if let firstAnchor = doc.firstChild(xpath: "//body/a") 137 { 138 //並輸出第一個網絡連接。 139 print(firstAnchor["href"] as Any) 140 } 141 142 //得到頭結點下的全部腳本節點, 143 for script in doc.xpath("//head/script") 144 { 145 //並輸出腳本節點的文檔路徑 146 print(script["src"] ?? "") 147 } 148 149 //得到主體節點下的全部連接節點, 150 if let result = doc.eval(xpath: "count(//body/a)") 151 { 152 //並在控制檯輸出該數量 153 print("anchor count : \(result.doubleValue)") 154 } 155 156 //輸出標題 157 print(doc.title as Any) 158 //輸出頭節點 159 print(doc.head as Any) 160 //輸出主題節點 161 print(doc.body as Any) 162 } 163 catch 164 { 165 print("Something went wrong :(") 166 } 167 } 168 169 override func didReceiveMemoryWarning() { 170 super.didReceiveMemoryWarning() 171 // Dispose of any resources that can be recreated. 172 } 173 }