CoderCastrov logo
CoderCastrov
Веб-парсинг

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

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

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

София Руссо

Привет 👋🏼

www.buymeacoffee.com