34 lines
1.5 KiB
Swift
34 lines
1.5 KiB
Swift
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
|
|
}
|
|
}
|