// func downloadTourneyListHTML() { // url string to URL guard let url = URL(string: "https://www.pickleballtournaments.com/pbt_tlisting.pl?when=F&selstate=AL&selsanctioning=&openregonly=false") else { // an error occurred print("Error: doesn't seem to be a valid URL") return } let request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 60.0) URLSession.shared.dataTask(with: request) { (data, response, error) in if let error = error as NSError? { NSLog("task transport error %@ / %d", error.domain, error.code) return } let response = response as! HTTPURLResponse let data = data! NSLog("task finished with status %d, bytes %d", response.statusCode, data.count) // blank line print() // content of url if let html = String(data: data, encoding: .isoLatin1) { // parse it into a Document do { print("parse start - takes a few seconds") let document = try SwiftSoup.parse(html) print("parse done") // blank line print() do { // get the "div row" elements for document section div class "tab-pane active tourneylist" let tabPaneRows = try document.select("div.tab-pane.active.tourneylist").select("div.row") // for each row for rw in tabPaneRows { var tourneyName = "" var tourneyID = "" var tourneyLocation = "" var tourneyDate = "" var tourneyStatus = "" var regEndDate = "" var regStartDate = "" var regAdvOnly = "" // get the "div infocenter" element let info = try rw.select("div.infocenter") // get the "h3" element let h3 = try info.select("h3") // get the tourneyName tourneyName = try h3.text() // get the tourney link let tLink = try h3.select("a").attr("href") // get the text range between "tid=" and end of line if let match = tLink.range(of: "(?<=tid=)([^\n]+)$", options: .regularExpression) { // clip the "ID" from the link tourneyID = String(tLink[match]) } // get the text from the first "p" tag from the info section tourneyLocation = try info.select("p").first()?.text() ?? "" // get the text from the "p tourney-date" tag tourneyDate = try rw.select("p.tourney-date").text() // look for "registration opennow" tag var tState = try rw.select("div.registration.opennow") if tState.count > 0 { // found a registration opennow div tourneyStatus = "OPEN" // get the registernow text regEndDate = try rw.select("p.registernow").text() } else { // did not find opennow div tourneyStatus = "CLOSED" // get the tState = try rw.select("div.registration.closednow") if tState.count > 0 { let adOnly = try rw.select("p.adonly") if adOnly.count > 0 { regAdvOnly = "Advertisment Only" } } else { // did not find opennow or closednow, so look for soon-date let soon = try rw.select("p.soon-date") if soon.count > 1 { regStartDate = try soon.text() } } } print("tourneyName:", tourneyName) print("tourneyID:", tourneyID) print("tourneyLocation:", tourneyLocation) print("tourneyDate:", tourneyDate) print("tourneyStatus:", tourneyStatus) print("regEndDate:", regEndDate) print("regStartDate:", regStartDate) print("regAdvOnly:", regAdvOnly) // here you would create a data object and add it to an array print() } // after populating your data array DispatchQueue.main.async { // call a UI func, such as // self.tableView.reloadData() } } catch Exception.Error(let type, let message){ print(message) } catch { print("error") } } catch let error { // an error occurred print("Error: \(error)") } } }.resume() }