Парсинг веб-страниц в 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 документами, поэтому обязательно ознакомьтесь с его документацией для получения дополнительной информации.