import Foundation import SwiftSoup public enum AToZParser { public static let baseSelector = "section.FilterComics_filterComics__9VGXB" static let cardSelector = "a[data-analytics-type=\"feature_card\"]" static let titleSelector = "h3" static let bylineSelector = "h4" static let imageSelector = "img" static let updatedSelector = "span" public static func parse(content: String) throws -> [Feature] { let document = try SwiftSoup.parse(content) let content = try element(from: document, selector: baseSelector) let links = try content.select(cardSelector) let features = try links.compactMap { card in let identifier = try card.attr("href") let title = try element(from: card, selector: titleSelector).text() let byline = try element(from: card, selector: bylineSelector).text() let image = try card.select(imageSelector).first().map { try $0.attr("src") }.flatMap { URL(string: $0) } let span = try card.select(updatedSelector).first() return Feature(identifier: identifier, title: title, byline: byline, imageURL: image, isUpdated: span != nil) } return features } static func element(from document: SwiftSoup.Element, selector: String) throws -> SwiftSoup.Element { guard let result = try document.select(selector).first() else { throw ParserError.missingElement(selector) } return result } }