Проблемы с доступом к элементам, ползущий пар - PullRequest
0 голосов
/ 09 июля 2020
from bs4 import BeautifulSoup
import requests



url = 'https://store.steampowered.com'
content = BeautifulSoup(requests.get(url).content, 'html.parser')
priceList = []
z = 0

for listing in content.find_all('div', {'class': 'hero_data'}):

    game_name = listing.find('div', {'class' : 'hero_name'}).text
    developer = listing.find('div', {'class': 'hero_stat'}).text
    for listing in content.find_all('div', {'class': 'discount_block discount_block_inline hero_discount'}):
        priceList.append(listing.find('div', {'class': 'discount_final_price'}).text)

    print(game_name)
    print(developer)
    print(priceList[z])
    z += 1


Я пытаюсь сканировать Steam в поисках названия каждой игры, разработчика, цены, издателя и обзора, просматривая его с помощью bs4. Сейчас у меня есть имя, разработчик и цена. Однако для издателя и обзора, поскольку они оба указаны так же, как и разработчик, когда я пытаюсь получить к ним доступ по его классу, он просто дает мне первый из html, который является разработчиком.

1 Ответ

1 голос
/ 09 июля 2020

Внутри есть переназначение l oop:

for listing in content.find_all('div', {'class': 'discount_block discount_block_inline 
    hero_discount'}):
    price = listing.find('div', {'class': 'discount_final_price'}).text

Вы перезаписываете цену и издателя для каждой итерации. Цена удерживает последнее значение итерации. Если вы хотите отображать каждую цену, вам лучше создать список и добавить в него каждую цену.

priceList = []
for listing in content.find_all('div', {'class': 'discount_block discount_block_inline 
    hero_discount'}):
    priceList.append(listing.find('div', {'class': 'discount_final_price'}).text)

Изменить: поскольку существует более одного элемента с атрибутом 'hero_stat', вам нужно будет сохранить их тоже в списке, используя findAll:

stats = list(map(lambda stat: stat.text, listing.find_all('div', {'class': 'hero_stat'})))   # this is a list
...