У меня есть следующий код для элемента списка продуктов:
<div class = "nice_product_item">
<div class = "npi_name">
<h2>
<a href = "/solutii-mobile-telefoane-mobile/apple-telefon-mobil-apple-iphone-13-super-retina-xdr-oled-6.1-256gb-flash-camera-duala-12-12-mp-wi-fi-5g-ios-negru-3824456.html">
<span style = "color:red">Stoc limitat!</span>
Telefon Mobil Apple iPhone 13, Super Retina XDR OLED 6.1", 256GB Flash, Camera Duala 12 + 12 MP, Wi-Fi, 5G, iOS (Negru)
</a>
</h2>
</div>
<div class = "price_block_list">
<span class = "old_price"> 999,00 Lei </span>
<span class = "price_discount">-12%</span>
<span class = "cheaper_by">mai ieftin cu 120,00 lei</span>
<span class = "real_price">879,00 Lei</span>
<span class = "evo-credit">evoCREDIT</span></div>
</div>
</div>
Некоторые товары имеют диапазон price_discount, а другие нет.
<span class = "price_discount">-12%</span>
Я использую следующий код для очистки названий продуктов:
texts = []
for a in soup.select("div.npi_name a[href]"):
if a.span:
text = a.span.next_sibling
else:
text = a.string
texts.append(text.strip())
Я не знаю, какие условия мне нужны, чтобы получить наименования товаров со скидками.
Примечание. Он должен работать для списка
Способ обработки данных может состоять в том, чтобы выбрать все товары со скидками:
soup.select('div.nice_product_item:has(.price_discount):has(a[href])')
Повторите ResultSet
, выберите нужную информацию и сохраните ее в структурированном виде, например, в виде списка диктов, чтобы обработать ее позже, например. DataFrame
и сохранить в csv, json, ...
from bs4 import BeautifulSoup
import pandas as pd
html = '''
<div class = "nice_product_item">
<div class = "npi_name">
<h2>
<a href = "/solutii-mobile-telefoane-mobile/apple-telefon-mobil-apple-iphone-13-super-retina-xdr-oled-6.1-256gb-flash-camera-duala-12-12-mp-wi-fi-5g-ios-negru-3824456.html">
<span style = "color:red">Stoc limitat!</span>
Telefon Mobil Apple iPhone 13, Super Retina XDR OLED 6.1", 256GB Flash, Camera Duala 12 + 12 MP, Wi-Fi, 5G, iOS (Negru)
</a>
</h2>
</div>
<div class = "price_block_list">
<span class = "old_price"> 999,00 Lei </span>
<span class = "price_discount">-12%</span>
<span class = "cheaper_by">mai ieftin cu 120,00 lei</span>
<span class = "real_price">879,00 Lei</span>
<span class = "evo-credit">evoCREDIT</span></div>
</div>
</div>
'''
soup = BeautifulSoup(html)
data = []
for e in soup.select('div.nice_product_item:has(.price_discount):has(a[href])'):
data.append({
'url' : e.a['href'],
'label' :s[-1] if (s := list(e.a.stripped_strings)) else None,
'price' : s.text if (s := e.select_one('span.real_price')) else None,
'discount' : s.text if (s := e.select_one('span.price_discount')) else None,
'other' : 'edit for elements you need'
})
pd.DataFrame(data)
URL | метка | цена | скидка | Другие |
---|---|---|---|---|
/solutii-mobile-telefoane-mobile/apple-telefon-mobil-apple-iphone-13-super-retina-xdr-oled-6.1-256gb-flash-camera-dual-12-12-mp-wi-fi-5g -ios-негру-3824456.html | Телефон Mobil Apple iPhone 13, Super Retina XDR OLED 6.1", флэш-память 256 ГБ, камера Duala 12 + 12 МП, Wi-Fi, 5G, iOS (черный) | 879,00 лей | -12% | редактировать для элементов, которые вам нужны |
Спасибо, @HedgeHog, была ошибка для 'метки' :list(e.a.stripped_strings)[-1], но я использовал одну из приведенных выше конструкций, и она работает
label2=s.text if (s:= e.select_one("div.npi_name a[href]")) else None label.append(метка)
'label' :list(e.a.stripped_strings)[-1], IndexError: индекс списка вне допустимого диапазона
@NFTChest: Спасибо, если нет <a>
, то правильно решить эту проблему. Улучшил мой пример, выбрав элемент более конкретно, поэтому он должен иметь .price_discount
и <a>
-> | soup.select('div.nice_product_item:has(.price_discount):has(a[href])')
| Упомянутый вами метод с конкретным условием if также работает. Отлично.
Что ты пытаешься сцарапать? Пожалуйста, редактировать ваш код, чтобы показать желаемый результат.