Суммируйте все целые числа, импортированные из BeautifulSoup - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь использовать BeautifulSoup для работы с Python.Я пытался добавить все импортированные целые числа, но не могу найти способ сделать это.

Вот код:

from bs4 import BeautifulSoup
import requests
source = requests.get('https://www.ebay.com/sch/i.html?_odkw=iphone+xr&_osacat=0&_from=R40&_trksid=m570.l1313&_nkw=iphone+xr+128+gb&_sacat=0').text
soup =BeautifulSoup(source, 'lxml')

for post in soup.find_all("li",{"class" : "s-item"}):
   price = post.find_all("span", {"class" : "s-item__price"})[0].text
   price2 = price.strip( '$' )
   price3 = price2.replace(",", "")
   price4 =price3[0:5]
   price5 = float(price4)
   price6 = round(price5)
   print(price6)

Он печатает:

1130
1226
1130
1100
870
17
1433
1089
652
944
728
575
740
610
730
882
760
530
660
958
750
588
730
730
645
754
750
750
361
909
332
751
750
746
550
773
831
888
750
922
939
927
485
680
1250
888
1117
650
775
600

По сути, я хочу сложить все в одно число.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Для начала, вы можете переписать все шаги в вашем цикле как отдельную функцию:

def get_price(post):
       price = post.find_all("span", {"class" : "s-item__price"})[0].text
       price2 = price.strip( '$' )
       price3 = price2.replace(",", "")
       price4 =price3[0:5]
       price5 = float(price4)
       price6 = round(price5)
       return price6

Теперь ваш цикл можно переписать как

for post in soup.find_all("li",{"class" : "s-item"}):
    print(get_price(post))

Что такоеВы спросите?Ну, встроенная функция Python sum имеет интерфейс, который позволяет вам передавать генератор следующим образом:

sum(get_price(post) for post in soup.find_all("li",{"class" : "s-item"}))

Или эквивалентно:

sum(map(get_price, soup.find_all("li",{"class" : "s-item"})))

Вы можете переписать свою функцию какоднострочный:

def get_price(post):
       return round(float(post.find_all("span", {"class" : "s-item__price"})[0].text.strip('$').replace(',', '')[:5]))

Это не сделает ваш код более разборчивым, но вы можете избежать написания отдельной функции здесь, используя эквивалентное выражение:

sum(round(float(post.find_all("span", {"class" : "s-item__price"})[0].text.strip('$').replace(',', '')[:5])) for post in soup.find_all("li",{"class" : "s-item"}))
0 голосов
/ 08 декабря 2018

Вот ваш ответ.Вам необходимо объявить переменную перед циклом for и инициализировать с помощью 0, а затем использовать эту переменную в цикле для суммирования значений цен и, наконец, за пределами цикла, выводить итоговые итоговые значения.Вот и все.

from bs4 import BeautifulSoup
import requests
from lxml import etree
source = requests.get('https://www.ebay.com/sch/i.html?_odkw=iphone+xr&_osacat=0&_from=R40&_trksid=m570.l1313&_nkw=iphone+xr+128+gb&_sacat=0').text
soup = BeautifulSoup(source, 'lxml')
total_price = 0
for post in soup.find_all("li",{"class" : "s-item"}):
  price = post.find_all("span", {"class" : "s-item__price"})[0].text
  price2 = price.strip( '$' )
  price3 = price2.replace(",", "")
  price4 = price3[0:5]
  price5 = float(price4)
  price6 = round(price5)
  total_price = total_price + price6
print("Sum price is: %d"%(total_price))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...