Разбор Swiftsoup не находит все HTML классов - PullRequest
1 голос
/ 26 апреля 2020

У меня есть метод для анализа веб-сайта с использованием Swiftsoup go, чтобы получить цену продукта:

@objc func actionButtonTapped(){

    let url = "https://www.overkillshop.com/de/c2h4-interstellar-liaison-panelled-zip-up-windbreaker-r001-b012-vanward-black-grey.html"

    let url2 = "https://www.asos.com/de/asos-design/asos-design-schwarzer-backpack-mit-ringdetail-und-kroko-muster/prd/14253083?clr=schwarz&colourWayId=16603012&SearchQuery=&cid=4877"



    do {


        let html: String = getHTMLfromURL(url: url2)
        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()
            print(try priceClass.className())
            print("pricetext: \(priceText)")
        }

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

Метод отлично работает для url, но для url2 это не так печатать все classNames, даже если они совпадают с regex. Вот где цена на самом деле:

<span data-id="current-price" data-bind="text: priceText(), css: {'product-price-discounted' : isDiscountedPrice }, markAndMeasure: 'pdp:price_displayed'" class="current-price">36,99 €</span>

Вывод функции такой:

product-price pricetext:

stock-price-retry -oos

цена_текст: повторение цены на акции

цена_текст:

Не печатается class=current-price. Что-то не так с моим regex или почему он не находит, что class ??

РЕДАКТИРОВАТЬ:

Я обнаружил, что price на самом деле не находится внутри HTML из url2. Только classes, которые фактически распечатаны, находятся внутри. В чем причина этого и как я могу это решить?

1 Ответ

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

html не является c. Это может измениться со временем. Если вы сделаете запрос get на URL сайта, вы получите начальное значение html для этого сайта. Но в браузерах есть такая вещь, называемая javascript, которая может со временем изменять HTML страницы. На самом деле это довольно часто: - сайт сначала загружается с некоторыми javascript - javascript (разработанным создателем сайта), чем работает и делает вещи - содержимое динамически изменяется, вызывая некоторый API с помощью этого javascript

Вы не можете очистить этот контент путем HTML очистки базового URL.

Если вы спросите меня, как бы я это сделал, в любом случае, ищите HTTP-запросы сайта, где он получает содержание. Посмотрите на этот API и используйте этот API самостоятельно. Получить данные и сохранить их на некоторых моих серверах. Затем на клиенте я вызываю API моего сервера, чтобы получить эти данные. Также я не совсем уверен, что это законно.

Но, насколько я понял по твоим последним вопросам, ты не хочешь этого делать.

Если вам действительно нужно сделать это на клиенте, вы можете использовать WKWebView, загрузить страницу, подождать, пока появится содержимое, и затем получить текущую HTML страницы, выполнив что-то вот так:

webView.evaluateJavaScript("document.documentElement.outerHTML.toString()", 
                           completionHandler: { (html: Any?, error: Error?) in
    print(html)
})

Посмотрите этот ответ , чтобы узнать больше об этом.

Я надеюсь, что это решит все ваши проблемы, потому что я думаю, что у меня нет гораздо больше времени, чтобы помочь вам: D

...