Недопустимая операция с десятичной дробью

#python

#python

Вопрос:

Я использую beautiful soup для извлечения информации с веб-сайта и получения цены товара. Я использовал приведенный ниже код для создания имен переменных prices для хранения информации. Затем я создал цикл для перебора всех элементов, и теперь я пытаюсь сравнить его с другой переменной с именем price_thres, чтобы определить, меньше или равно ли оно сумме. Выполнение этого кода выводит несколько правильных значений, но также выводит

     price_in_dec = Decimal(i.text)
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
 
 prices = soup.find_all("span", itemprop="price")

for i in prices:
    price_in_dec = Decimal(i.text)
    if price_in_dec <= price_thres:
        print(price_in_dec)
 

Комментарии:

1. Можем ли мы узнать, какой веб-сайт вы пытаетесь очистить? или добавить часть HTML? Я полагаю, что ваша проблема связана с одним из элементов.

2. URL- адрес ammobuy.com/ammo/9mm Я извлекаю данные о ценах с сайта, и они отображаются правильно, но он выдает эту ошибку в конце после печати 6 цен ниже price_thres, которые являются десятичными (40,00)

Ответ №1:

Кажется, у вас есть запятые ( , ) в некоторых ваших ценах.

Попробуйте это:

 import locale

# Set to US locale
locale.setlocale(locale.LC_ALL, 'USA')

prices = soup.find_all("span", itemprop="price")

for i in prices:
    price_in_dec = Decimal(locale.atof(i.text))
    if price_in_dec <= price_thres:
        print(price_in_dec)
 

Используя правильный язык, вы можете анализировать цены в соответствии с тем, как вы их пишете в США.

Другим вариантом было бы просто удалить запятые с помощью i.text.replace(",", "") .

Комментарии:

1. Спасибо, что сработало, некоторые цены печатаются намного больше, чем мне нужно, так есть ли простой способ остановить их после позиции центов? Примером того, что он печатает сейчас, является «26.969999999999998863131622783839702606201171875»

2. Неважно, я понял, я использовал i.text.replace, и это устранило мою проблему. Большое спасибо, что очень помогло, и я понимаю, почему сейчас он выдает ошибку!

3. Привет @zach_hutz, если этот или любой другой ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы принять его, установив флажок. Это указывает более широкому сообществу, что вы нашли решение, и дает некоторую репутацию как ответчику, так и вам. Нет никаких обязательств делать это.

4. Рад, что смог помочь 🙂