Соскрести цену продукта с любого сайта с помощью Swift Soup - PullRequest
0 голосов
/ 19 апреля 2020

Внутри моего приложения я бы хотел оценить цену любого продукта (пользователь вводит нужный URL).

Я немного искал сейчас и обнаружил, что есть пара Webscrapers, я думаю, что сейчас буду использовать SwiftSoup. Однако я не смог найти ни одного учебника, который учит, как scrape для элементов с «Dynami c» tags. Например, price продукта на веб-сайте выглядит по-разному для каждого веб-сайта:

Пример 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>

Я знаю, что могу scrape таких элементов:

let html: String = "<a id=1 href='?foo=bar&mid&lt=true'>One</a> <a id=2 href='?foo=bar&lt;qux&lg=1'>Two</a>";
let els: Elements = try SwiftSoup.parse(html).select("a");
for element: Element in els.array(){
    print(try element.attr("href"))
}

Но что лучший способ динамически scrape? Ничего не могу найти по этому поводу, поэтому я рад за любую помощь:)

Обновление

Мне удалось получить правильную 'цену' если я знаю точное имя класса:

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: Element = try doc.getElementsByClass(className).first()!
        let priceText : String = try price.text()

        result.text = priceText

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

Тем не менее, я хотел бы заставить эту работу работать так, чтобы все 3 примера выше работали. Прямо сейчас я изо всех сил пытаюсь получить правильное 'регулярное выражение', которое включает все три примера ... Кто-нибудь идея?

1 Ответ

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

Я не думаю, что есть способ очистить практически что-нибудь "динамически". У вас нет возможности обнаружить все возможные способы, которыми люди могут написать html, указав вам цену.

То, что вы могли бы сделать, но я не думаю, что это было бы так просто, это обучить модели машинного обучения обнаружению цены в большинстве случаев . Но это, вероятно, выходит за рамки этого вопроса.

Другой способ, которым вы можете попробовать, - это просто посмотреть на большинство сайтов и добавить несколько алгоритмов "generi c" для очистки их сайтов. Если один не работает, вы просто пытаетесь с другим, пока не преуспеете или не сдадитесь. Таким образом, избегая жесткого кодирования имен классов и прочего, вы, по крайней мере, очистите все сайты, которые имеют структуру, аналогичную той, что есть в ваших обобщенных c скребках.

Один способ (но я верю вы могли бы подумать о других, более эффективных способах) Я хотел бы подойти к реализации алгоритма скребка «generi c», чтобы получить список регулярных выражений класса цен для сопоставления и попробовать их все, пытаясь затем проверить результаты, которые вы получаете внутри текста html (например, есть ли внутри текста какое-либо число? Содержит ли оно такие символы, как €, $, ..? et c.). Я бы начал с чего-то вроде .*price.* и других подобных регулярных выражений, которые вы можете просто найти, просмотрев большинство сайтов.

Вы наверняка столкнетесь с некоторыми сайтами, о которых вы даже не думали. Затем вы можете отправить себе эту информацию (когда на клиенте вы обнаружите, что не можете найти цену на сайте), и вы можете посмотреть сайт самостоятельно и добавить дополнительные регулярные выражения в свой список (которые, вероятно, потребуется обновить сервер). и загружается на ваш клиент каждый раз, когда он обновляется), если это решает проблему, или добавьте другой алгоритм скребка, или сделайте один из ваших предыдущих более универсальным c и работайте с этим вариантом использования тоже (но это требует нового выпуска приложения) .

Извините, если этот ответ не очень конкретен c, но ваш вопрос был настолько широким, что было почти невозможно его конкретизировать c.

PS: Не уверен если это лучший подход (возможно, какой-то синтаксический анализатор лучше подходит для этого), но одно регулярное выражение, которое я мог бы быстро придумать, соответствует всем 3 вашим примерам, где <[^>]*class=".*price.*"[^>]*>([^<]*)<. Возможно, есть что-то более умное, но с помощью этого регулярного выражения вы автоматически получите текст внутри элемента html в первой группе захвата. Чем вам нужно просто санировать его (удалить ненужные символы и т. Д. c) и, возможно, проверить его.

...