Как извлечь значение скидки (% скидки)?

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

from bs4 import BeautifulSoup as soup
import pandas as pd
import requests
import urllib

data =[]

def getdata (url):
    header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' } 
    req = urllib.request.Request(url, headers=header)
    amazon_html = urllib.request.urlopen(req).read()
    a_soup = soup(amazon_html,'html.parser')
    
    for e in a_soup.select('div[data-component-type="s-search-result"]'):
        

        try:
            title = e.find('h2').text
        except:
            title = None
            
        try:
            sponsored = e.find('span',{'class':'a-color-secondary'}).text
        except:
            sponsored = None
            
        try:
            limited_deal = e.find('span',{'class':'a-badge-label-inner a-text-ellipsis'}).find('span', {'class': 'a-badge-text'}).text
        except:
            limited_deal = None
            
        
            
        data.append({
            'list_price':list_price,
            'sponsored':sponsored,
            'limited_deal':limited_deal
            
        })
        
    return a_soup

def getnextpage(a_soup):
    try:
        page = a_soup.find('a',attrs={"class": 's-pagination-item s-pagination-next s-pagination-button s-pagination-separator'})['href']
        url =  'http://www.amazon.in'+ str(page)
    except:
        url = None
    return url


keywords = ['earphones']

for k in keywords:
    url = 'https://www.amazon.in/s?k='+k
    while True:
        geturl = getdata(url)
        url = getnextpage(geturl)

        if not url:
            break
        print(url)

Как получить скидку (% скидка). Я еще не написал для этого никакого кода, остальные результаты отображаются правильно.

<The value is highlighted on the screenshot

Вы можете выбрать innerHTML его родителя и извлечь значение (используя манипуляции с регулярными выражениями/строками)

M B 09.04.2022 10:09
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Введение в технологический стек Twitch
Введение в технологический стек Twitch
В этой статье мы подробно рассмотрим стек Twitch, который подразделяется на следующий набор технологий:
8 полезных HTML-тегов, которые лучше использовать вместо <div>
8 полезных HTML-тегов, которые лучше использовать вместо <div>
Когда я только начинал изучать html, я использовал div для всего, это был один из первых тегов, которые я выучил, и казалось, что он работает в любой...
HTML5: API локального хранилища (Local Storage)
HTML5: API локального хранилища (Local Storage)
LocalStorage - это простой способ хранения данных в браузере пользователя.
Доступность HTML - программирование с инклюзивной перспективой
Доступность HTML - программирование с инклюзивной перспективой
Представьте, что вы хотите поехать на пляж. Представьте, что вы упорно трудились весь год и заслужили это. Прибыв на место, вы обнаруживаете, что...
Именование классов CSS: Конвенция именования BEM
Именование классов CSS: Конвенция именования BEM
Сопровождаемость кода, сама по себе, является пульсирующим эффектом нескольких факторов. Когда часть программного обеспечения читабельна, ясна,...
0
1
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете получить скидку от span class="a-price-whole"

from bs4 import BeautifulSoup as soup
import pandas as pd
import requests
import urllib

data =[]

def getdata (url):
    header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' } 
    req = urllib.request.Request(url, headers=header)
    amazon_html = urllib.request.urlopen(req).read()
    a_soup = soup(amazon_html,'html.parser')
    
    for e in a_soup.select('div[data-component-type="s-search-result"]'):
        

        try:
            title = e.find('h2').text
        except:
            title = None
            
        try:
            sponsored = e.find('span',{'class':'a-color-secondary'}).text
        except:
            sponsored = None
            
        try:
            limited_deal = e.find('span',{'class':'a-badge-label-inner a-text-ellipsis'}).find('span', {'class': 'a-badge-text'}).text
        except:
            limited_deal = None
        
        try:
            list_price = e.select_one('.a-letter-space +span').text
            print(list_price)
        except:
            limited_deal = None
            
        
            
        data.append({
            #'list_price':list_price,
            'sponsored':sponsored,
            'limited_deal':limited_deal
            
        })
        
    return a_soup

def getnextpage(a_soup):
    try:
        page = a_soup.find('a',attrs={"class": 's-pagination-item s-pagination-next s-pagination-button s-pagination-separator'})['href']
        url =  'http://www.amazon.in'+ str(page)
    except:
        url = None
    return url


keywords = ['earphones']

for k in keywords:
    url = 'https://www.amazon.in/s?k='+k
    while True:
        geturl = getdata(url)
        url = getnextpage(geturl)

        if not url:
            break
        #print(url)

Выход:

(70% off)
(56% off)
(70% off)
(70% off)
(63% off)
(25% off)
(53% off)
(50% off)
(63% off)
(43% off)
(57% off)
(62% off)
(50% off)
(60% off)
(69% off)
(50% off)
(41% off)
(60% off)
(70% off)

... скоро

Если вам нужна только цифра

from bs4 import BeautifulSoup as soup
import pandas as pd
import requests
import urllib

data =[]

def getdata (url):
    header = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64)' } 
    req = urllib.request.Request(url, headers=header)
    amazon_html = urllib.request.urlopen(req).read()
    a_soup = soup(amazon_html,'html.parser')
    
    for e in a_soup.select('div[data-component-type="s-search-result"]'):
        

        try:
            title = e.find('h2').text
        except:
            title = None
            
        try:
            sponsored = e.find('span',{'class':'a-color-secondary'}).text
        except:
            sponsored = None
            
        try:
            limited_deal = e.find('span',{'class':'a-badge-label-inner a-text-ellipsis'}).find('span', {'class': 'a-badge-text'}).text
        except:
            limited_deal = None
        
        try:
            list_price = e.select_one('.a-letter-space +span').text.split('%')[0].replace('(','')
            print(list_price)
        except:
            limited_deal = None
            
        
            
        data.append({
            #'list_price':list_price,
            'sponsored':sponsored,
            'limited_deal':limited_deal
            
        })
        
    return a_soup

def getnextpage(a_soup):
    try:
        page = a_soup.find('a',attrs={"class": 's-pagination-item s-pagination-next s-pagination-button s-pagination-separator'})['href']
        url =  'http://www.amazon.in'+ str(page)
    except:
        url = None
    return url


keywords = ['earphones']

for k in keywords:
    url = 'https://www.amazon.in/s?k='+k
    while True:
        geturl = getdata(url)
        url = getnextpage(geturl)

        if not url:
            break
        #print(url)

Выход:

70
56
70
70
63
25
53
50
63
50
57
62
60
69
50
43
60
70
41
61
53
61
57
53
61
70
70
60
75
57
75
18
62
61
38
60
80
71
70
60
81
47
70
53
57
62
53
64
57
37
80
42
83
55
53
78
63

Я не ищу цену листинга, а процент от листинга. Пожалуйста, проверьте скриншот

Jhonny 09.04.2022 10:39

@ Джонни, я пудрился

F.Hoque 09.04.2022 10:44

Есть ли способ передать список, например ["динамики", "наушники", "телефоны", "ноутбуки", "телевизор", "маршрутизатор"] и запустить, не получая ошибку 503?

Jhonny 09.04.2022 11:05

@Jhonny, это было бы немного сложно объяснить здесь. Было бы намного лучше создать еще один вопрос. спасибо

F.Hoque 09.04.2022 11:10

Вы можете использовать селектор css .a-letter-space+ span с методом выбора BeautifulSoup и прокручивать результат, чтобы извлечь текст скидки.

Вот пример кода:

import requests
from bs4 import BeautifulSoup

def extract_discount(discount_str):
    """
    Extract discount from an unformatted
    discount string like: (70% off)
    Returns: number extracted as string. Ex: 70
    """
    return discount_str.text.split('%')[0].replace('(','')

# using googlebot's user agent
headers = {
    'User-Agent': 'Mozilla/5.0 AppleWebKit/27.0.1453 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Safari/27.0.1453'
}
res = requests.get('https://www.amazon.in/s?k=earphones', headers=headers)

soup = BeautifulSoup(res.content, 'html.parser')

for discount in soup.select('.a-letter-space+ span'):
    # just remove extract_discount if you just want (70% off)   
    print(extract_discount(discount))

Другие вопросы по теме