Регулярное выражение для поиска HTML классов с JSOUP - PullRequest
0 голосов
/ 26 апреля 2020

Для моего проекта мне нужно разобрать HTML и получить цену продукта. Вот как я это делаю в данный момент:

let url = "https://www.adidas.de/adistar-trikot/CV7089.html"
let className = "gl-price__value"

do {
    let html: String = getHTMLfromURL(url: url)
    let doc: Document = try SwiftSoup.parse(html)

    let price: Elements = try doc.getElementsByClass(className)

    let priceText : String = try price.text()

    result.text = priceText

} catch Exception.Error(let type, let message) {
    print(message)
} catch {
    print("error")
}

Вопрос:

Как я могу изменить className на regex, так что все 3 примера ниже будет соответствовать? Я попробовал несколько возможностей сейчас, но не могу заставить его работать. Рад за любую помощь!

Пример 1:

<div class="price">82 EUR</div>

Пример 2:

<span class="gl-price__value">€ 139,95</span>

Пример 3:

<span id="priceblock_ourprice" class="a-size-medium a-color-price priceBlockBuyingPriceString">79,99&nbsp;€</span>

1 Ответ

1 голос
/ 26 апреля 2020

Может быть, getElementsByClass - не лучший способ для go. From SwiftSoup Readme - используйте синтаксис селектора для поиска элементов

SwiftSoup поддерживает синтаксис селектора типа CSS (или jQuery) для поиска подходящих элементов, что позволяет очень мощным и надежные запросы.

[attr~=regex]: элементы со значениями атрибутов, которые соответствуют регулярному выражению; например, img[src~=(?i)\.(png|jpe?g)]

Ваш код станет примерно таким:

let doc: Document = try SwiftSoup.parse(html)

let priceClasses: Elements = try doc.select("[class~=(?i)price]")

for priceClass: Element in priceClasses.array() {
    let priceText : String = try priceClass.text()
    ...
}
...

Я использую price здесь в качестве регулярного выражения на основе предоставленных вами примеров, но Вы можете адаптировать, как вам нужно.

...