Парсинг веб-страниц в iOS-приложениях

Table Of Content
Вот пример на Swift, который использует фреймворк Foundation для парсинга информации с веб-сайта. В этом примере мы будем парсить заголовки лучших постов на подреддите Swift.
Сначала создадим функцию, которая будет выполнять парсинг:
import Foundation
func парситьSwiftПодреддит() {
// URL подреддита Swift
let url = URL(string: "https://www.reddit.com/r/swift/")!
// Создаем URLSession
let session = URLSession.shared
// Создаем data task для выполнения HTTP GET запроса
let task = session.dataTask(with: url) { data, response, error in
// Проверяем наличие ошибок
if let error = error {
print("Ошибка: \(error.localizedDescription)")
return
}
// Проверяем ответ
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
print("Ошибка: Неверный ответ")
return
}
// Проверяем наличие данных
guard let data = data else {
print("Ошибка: Данные не получены")
return
}
// Преобразуем данные в строку
guard let htmlString = String(data: data, encoding: .utf8) else {
print("Ошибка: Не удалось преобразовать данные в строку")
return
}
// Используем регулярные выражения для извлечения заголовков постов
let pattern = "<h3 class=\"_eYtD2XCVieq6emjKBH3m\">(.+)</h3>"
let regex = try! NSRegularExpression(pattern: pattern)
let matches = regex.matches(in: htmlString, range: NSRange(htmlString.startIndex..., in: htmlString))
// Выводим заголовки лучших постов
for match in matches {
let range = match.range(at: 1)
if let titleRange = Range(range, in: htmlString) {
let title = htmlString[titleRange]
print(title)
}
}
}
// Запускаем data task
task.resume()
}Эта функция сначала создает объект URL для подреддита Swift. Затем она создает объект URLSession и использует его для создания data task, который выполняет HTTP GET запрос для данного URL.
Если в запросе или ответе возникнут ошибки, функция выведет сообщение об ошибке и вернется. Если есть данные, функция преобразует их в строку, используя кодировку .utf8.
Затем функция использует регулярное выражение для извлечения заголовков лучших постов из HTML строки. Регулярное выражение ищет текст внутри тега <h3> с классом _eYtD2XCVieq6emjKBH3m.
Наконец, функция выводит заголовки лучших постов.
Чтобы вызвать эту функцию, просто добавьте следующую строку в ваш код:
парситьSwiftПодреддит()При запуске кода вы должны увидеть заголовки лучших постов на подреддите Swift, выведенные в консоль.
Вот более сложный пример, который использует библиотеку SwiftSoup для парсинга информации с веб-сайта. В этом примере мы будем парсить последние заголовки с главной страницы New York Times.
Сначала установим библиотеку SwiftSoup. Для этого добавьте следующую строку в ваш файл Package.swift:
dependencies: [
.package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.3.2"),
]Затем запустите swift package update, чтобы загрузить и установить библиотеку.
Далее создадим функцию, которая будет выполнять парсинг:
import Foundation
import SwiftSoup
func парситьЗаголовкиNYT() {
// URL главной страницы New York Times
let url = URL(string: "https://www.nytimes.com/")!
// Создаем URLSession
let session = URLSession.shared
// Создаем data task для выполнения HTTP GET запроса
let task = session.dataTask(with: url) { data, response, error in
// Проверяем наличие ошибок
if let error = error {
print("Ошибка: \(error.localizedDescription)")
return
}
// Проверяем ответ
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
print("Ошибка: Неверный ответ")
return
}
// Проверяем наличие данных
guard let data = data else {
print("Ошибка: Данные не получены")
return
}
// Преобразуем данные в строку
guard let htmlString = String(data: data, encoding: .utf8) else {
print("Ошибка: Не удалось преобразовать данные в строку")
return
}
// Используем SwiftSoup для парсинга HTML строки
do {
let doc = try SwiftSoup.parse(htmlString)
// Находим последние заголовки
let headlines = try doc.select("h2 > a")
// Выводим заголовки
for headline in headlines {
print(try headline.text())
}
} catch let error {
print("Ошибка: \(error.localizedDescription)")
}
}
// Запускаем data task
task.resume()
}Эта функция использует ту же основную структуру, что и предыдущий пример, но она использует библиотеку SwiftSoup для парсинга HTML строки и извлечения заголовков.
Функция сначала создает объект Document с помощью SwiftSoup.parse(_:). Затем она использует doc.select(_:), чтобы найти все элементы <a>, которые являются прямыми потомками элементов <h2>.
Наконец, функция использует headline.text() для извлечения текста каждого заголовка и выводит его.
Чтобы вызвать эту функцию, просто добавьте следующую строку в ваш код:
парситьЗаголовкиNYT()При запуске кода вы должны увидеть последние заголовки с главной страницы New York Times, выведенные в консоль.
Обратите внимание, что в реальной ситуации вам может потребоваться изменить CSS селектор или использовать более сложные техники для извлечения нужной информации. SwiftSoup предоставляет богатый набор API для работы с HTML и XML документами, поэтому обязательно ознакомьтесь с его документацией для получения дополнительной информации.
