Различные значения при парсинге ozon

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium_stealth import stealth
import time

arts = [
    '840055507'
]
cards = []
def saveCardInfo(art):

    cst = driver.find_element(By.CSS_SELECTOR,"div[data-widget^='webPrice']")
    print(cst.text.split('\n'))
    print(cst.text)

def initDriver():
    driver = webdriver.Chrome()
    stealth(driver,
    platform="Win32")
    return driver

driver = initDriver()
driver.get('https://www.ozon.ru/')

for art in arts:
    time.sleep(1)
    srch_inp = driver.find_element(By.TAG_NAME, 'input')
    srch_inp.send_keys(f"{art}\n")
    saveCardInfo(art)

driver.quit()

Код выше парсит определенные товары на озоне. Есть проблемы с получением цены товара: При выполнении кода выводит следующее:

['1\u2009151\u2009₽', 'c Ozon Картой', '1\u2009187\u2009₽', '4\u2009290\u2009₽', 'без Ozon Карты']

1 151 ₽

c Ozon Картой

1 187 ₽

4 290 ₽

без Ozon Карты

Проблема заключается в том, одни и те же значения различаются, а именно сам ценник товара. К примеру, если просто принтить то выведет - "1 151 ₽",а если это заносить в список или переменную будет выглядеть как '1\u2009151\u2009₽'.Пробовал еще BeatifulSoup, результат тот же

С чем это может быть связано и что с этим можно сделать?


Ответы (1 шт):

Автор решения: ʏʊքɨ

Смотри, прочитай что такое символы unicode, в данном случае на странице ozon цены записаны с использованием символов U+2009(пустое пространство между цифрами), в python символы unicode записываются вот так -- \u ну и код символа, что ты и видишь собственно, \u2009, ты создаешь список с помощью split, по разделителю \n, и когда ты принтишь список, то элементы списка выводятся в python-овском виде, а когда выводишь по отдельности, твоя командная оболочка, выводит их в правильном виде, поэтому и получается разнобой.

Вот код, который уберет символ \u2009 из цен:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium_stealth import stealth
import time

arts = [
    '840055507'
]
cards = []
def saveCardInfo(art):

    cst = driver.find_element(By.CSS_SELECTOR,"div[data-widget^='webPrice']")
    cst_text = cst.text.replace('\u2009', '') # это убирает unicode символ из всего распарсенного тобой текста
    # можно вместо этого символа вставить пробел, тогда вот так должно быть для этого:
    #cst_text = cst.text.replace('\u2009', ' ')
    # используя ту же конструкцию .replace, ты можешь заменить символ ₽ на что-нибудь другое или убрать его, например, чтобы убрать, закоменти ту строку и вставь эту:
    #cst_text = cst_text = cst.text.replace('\u2009', '').replace('₽', '')
    print(cst_text.split('\n'))
    print(cst_text)

def initDriver():
    driver = webdriver.Chrome()
    stealth(driver,
    platform="Win32")
    return driver

driver = initDriver()
driver.get('https://www.ozon.ru/')

for art in arts:
    time.sleep(1)
    srch_inp = driver.find_element(By.TAG_NAME, 'input')
    srch_inp.send_keys(f"{art}\n")
    saveCardInfo(art)

driver.quit()

Да и вообще лучше подучи для начала основы языка, а потом пиши парсеры.

→ Ссылка