проблема с данными при парсинге. Список без кавычек
Я новичок в пайтоне, и недавно начал изучать парсинг данных с помощью beautifulsoup. Решил спарсить цены на одежду в wildberries и заметил, что данные о цене приходят в странном формате - списке без кавычек. По тегу с помощью метода get_text цену узнать не удалось, мною было принято решение сделать цикл на отсеивание ненужных символов:
price = ['<ins class="lower-price"> 6 150 ₽</ins>']
counter = 0
text = ''
for i in price[0]:
if i == '<':
counter += 1
elif i == '>':
counter += 1
elif counter == 2:
text += i
print(text)
Price - это пример списка, который приходит когда я вызываю price = item.findAll('ins', class_ = "lower-price"), разве что в данном примере он с кавычками. Запустил код в отдельном файле - все работало как и задумывалось, выводилась цена в 6 150 P. Запускаю в оригинальном файле со строкой price = item.findAll('ins', class_ = "lower-price"), и все пошло наперекосяк. Переменная text выводилась пустой, а когда я выводил вместо text переменнную i следущим образом:
for i in price[0]:
if i == '<':
counter += 1
elif i == '>':
counter += 1
elif counter == 2:
text += i
print(i)
То почему-то сразу выводилась цена. Может быть я что-то не так делаю? Думаю дело в самих возвращаемых данных - списке без кавычек, но все же хотелось бы услышать поподробнее. Вот полный пример кода:
import requests
from bs4 import BeautifulSoup as BS
def parse(url):
response = requests.get(url)
soup = BS(response.content, 'html.parser')
items = soup.find('div', attrs = {'class': "catalog_main_table j-products-container", 'data-card-size':"c246x328", 'data-image-size':"c252x336", 'data-countereventsinfo':"", 'data-target-url':"GP", 'data-addtoponed-url':"/product/postpone", 'data-addtobasket-url':"https://lk.wildberries.ru/product/addtobasket", 'data-basket-url':"https://lk.wildberries.ru/basket", 'data-source':"Cataloger", 'data-item-selector':".j-card-item", 'data-enable-arrows':"true"})
# print(items.text)
for item in items:
try:
try:
if item.findAll('ins', class_ = "lower-price") != []:
price = item.findAll('ins', class_ = "lower-price")
counter = 0
text = ''
for i in price[0]:
if i == '<':
counter += 1
elif i == '>':
counter += 1
elif counter == 2:
text += i
print(i)
except():
price = item.findAll('span', class_ = "lower-price")
counter = 0
text = ''
for i in price[0]:
if i == '<':
counter += 1
elif i == '>':
counter += 1
elif counter == 2:
text += i
print(i)
except(AttributeError):
pass
parse('https://www.wildberries.ru/catalog/muzhchinam/odezhda/bryuki-i-shorty/banany')
P.s. насколько я понял, прохождение по price дает только 1 элемент - цену, т.е от туда извлекается только текстовая инфа при проходе, и причем сама цена(условно 3300 р) является 1 элементом. От сюда и отсутствие индексирования(i не будет сначала 3, потом еще раз 3 и потом двумя нолями и значком рубля, она сразу будет 3300 р. И я ошибся, можно извлечь текст - price[0].get_text(). Если что-то забыл - напишите пожалуйста.
Ответы (1 шт):
import re
import requests
from bs4 import BeautifulSoup as bs
url = '...'
r = requests.get(url)
soup = bs(r.content, 'html.parser')
container = soup.find('div', class_='catalog_main_table j-products-container')
text = container.findAll('ins', class_='lower-price')[0].get_text()
print(text)
# <ins class="lower-price"> 3 419 ₽</ins>
print(re.sub('[^0-9]', '', text))
# 3419