Найти - Пользователи
Полная версия: Нужна срочная помощь, не могу понять
Начало » Центр помощи » Нужна срочная помощь, не могу понять
1 2 3
dolcorp
https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b/uralsk
В городе Уральск цена 299 990, а берется цена города Алматы 239 992
xam1816
  
import requests
from bs4 import BeautifulSoup
headers = {
    'Cookie':"language_id=3; city_id=14;selected_city_id=14"}
url = 'https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b/uralsk'
session = requests.Session()
resp = session.get(url, headers=headers)
html = resp.content.decode()
soup = BeautifulSoup(html, 'html.parser')
search = soup.find('div', class_='product__main-price-wrapper super-price')
search = search and search.find('div', class_='product__price')
out = search and search.text
print(out)

299 990 ₸

py.user.next
  
>>> import urllib.request
>>> import bs4
>>> 
>>> def get_filtered_price(node):
...     out = {}
...     old_price = node.find(
...         'div', class_='product__price-old')
...     discount_price = node.find(
...         'div', class_='product__price discounted-price')
...     product_price = node.find(
...         'div', class_='product__price')
...     super_price = node.find(
...         'div', class_='product__super')
...     if old_price is not None:
...         if discount_price is not None:
...             dp_sticker = discount_price.find(
...                 'span', attrs={'discounted-price-sticker': ''}).string
...             dp_sticker_clean = clear_sticker_string(dp_sticker)
...             dp_price = discount_price.find_all('span')[1].string
...             dp_price_clean = clear_price_string(dp_price)
...             out = {'type': 'discount',
...                    'level': dp_sticker_clean,
...                    'price': dp_price_clean}
...         else:
...             op_price = old_price.string
...             op_price_clean = clear_price_string(op_price)
...             out = {'type': 'old',
...                    'price': op_price_clean}
...     elif product_price is not None:
...         if super_price is not None:
...             pp_price = product_price.string
...             pp_price_clean = clear_price_string(pp_price)
...             out = {'type': 'discount',
...                    'level': 'percent',
...                    'price': pp_price_clean}
...         else:
...             pp_price = product_price.string
...             pp_price_clean = clear_price_string(pp_price)
...             out = {'type': 'fixed',
...                    'price': pp_price_clean}
...     return out
... 
>>> def clear_price_string(text):
...     out = ''.join(i for i in text if i.isdigit() or i == '.')
...     return out
... 
>>> def clear_sticker_string(text):
...     out = 'low' if text == 'от' else 'undefined'
...     return out
... 
>>> def f(url, city_id):
...     out = {}
...     headers = {
...         'Cookie': 'city_id={0}'.format(city_id)
...     }
...     req = urllib.request.Request(url=url, headers=headers)
...     with urllib.request.urlopen(req) as data:
...         text = data.read().decode('utf-8')
...     doc = bs4.BeautifulSoup(text, 'html.parser')
...     product = doc.find(class_='product__item product__item-js tile-container')
...     out['base_price'] = product['data-price']
...     price = doc.find(class_='product__main-price-wrapper')
...     out['least_price'] = get_filtered_price(price)
...     return out
... 
>>> f('https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b', '1')
{'base_price': '299990.0', 'least_price': {'type': 'discount', 'level': 'low', 'price': '239992'}}
>>> f('https://www.sulpak.kz/g/noutbuki_acer_extensa_15_ex215_52_i382sun_nxeg8er00b', '14')
{'base_price': '299990.0', 'least_price': {'type': 'fixed', 'price': '299990'}}
>>> f('https://www.sulpak.kz/g/noutbuki_acer_nitro_5_an515_57__i5165sgn_nhqeker004', '1')
{'base_price': '439990.0', 'least_price': {'type': 'discount', 'level': 'percent', 'price': '389990'}}
>>> f('https://www.sulpak.kz/g/noutbuki_acer_nitro_5_an515_57__i5165sgn_nhqeker004', '14')
{'base_price': '439990.0', 'least_price': {'type': 'discount', 'level': 'percent', 'price': '389990'}}
>>>
dolcorp
Всем доброе утро! Вы можете вставить Ваше решение в мой скрипт, я повторюсь что я не понимаю куда это вставлять и что заменить
py.user.next
dolcorp
Вы можете вставить Ваше решение в мой скрипт
Закомментировал твои куски и вставил свои.
dolcorp
Спасибо огромное, но все равно берется цена что и раньше
dolcorp
Может сделать вот такую последовательность приоритета
1<div class=“product__price-old”>
2<div class=“product__price-old-super”>
3<div class=“product__price”>
dolcorp
У меня в конце обработки скрипта создается Эксель таблица и в ней снова не та цена
py.user.next
dolcorp
Спасибо огромное, но все равно берется цена что и раньше
А он скачивает алматинскую страницу просто. Вот у меня в примере видно, что у меня оно как раз всё правильно качает и всё правильно находит. Не всё, конечно, находит, потому что я не углублялся в проценты там во все, но все базовые вещи разделяет на типы и не путает один вид цены с другим.

dolcorp
Может сделать вот такую последовательность приоритета
Не, дело в том, что надо скачивать страницу правильно.

Вот я тут обходной вариант написал.

Твоё закомментировал, своё вставил. Пришлось подменять понятие page из requests, потому что вот этот крендель, который тебе это писал, не знает про уровни зацепления модулей (каплинг), и из-за этого теперь этот requests невозможно вырезать из программы, когда он нафиг не нужен становится. То есть вместо того, чтобы из страницы полученной сделать словарь хотя бы, который не привязан ни к каким модулям с их внутренней структурой, он прямо эту страницу полученную возвращает из функции и все остальные функции снаружи должны знать, что эта страница именно через модуль requests скачана. И всё этим пронизано. Нахера такое делать? Ну, только если ты не знаешь про каплинг.
dolcorp
По ссылке цена берется верно, эту ссылку я вставлял специально в фаиле Конфиг чтобы можно было посмотреть на одном товаре. Но теперь вставил туда категорию ноутбуков, ранее парсер сканировал категорию(категории если их несколько) полностью и в эксель добавлялись товары с остатками и ценами, а теперь ошибка вылетает. Приложил фаил с категорией ноутбуков
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB