Trouble Looping с красивым супом - PullRequest
0 голосов
/ 19 сентября 2019

Я новичок в Python и в настоящее время изучаю утилизацию с использованием BeautifulSoup.Я пытаюсь получить информацию в Steam для отображения названия игры, цены и жанра.Я могу заставить свой код найти все это, но когда я вставляю в цикл for, это не работает.Вы можете определить проблему?

Большое спасибо за помощь!

Это покажет все, что мне нужно (и больше) на странице (имя, цена, жанр) *

from bs4 import BeautifulSoup
import requests
import json
url = 'https://store.steampowered.com/tags/en/Adventure/#p=0&tab=NewReleases'
response = requests.get(url, timeout=9)
content = BeautifulSoup(response.content, "html.parser")
for item in content.findAll("div", attrs={"id": "tab_content_NewReleases"}):
    print(item.text)

Это покажет только первую игру, поэтому я считаю, что она не зацикливается правильно *

from bs4 import BeautifulSoup
import requests
import json
url = 'https://store.steampowered.com/tags/en/Adventure/#p=0&tab=NewReleases'
response = requests.get(url, timeout=9)
content = BeautifulSoup(response.content, "html.parser")
for item in content.findAll("div", attrs={"id": "tab_content_NewReleases"}):
    itemObject = {
        "name": item.find("div", attrs={"class": "tab_item_name"}).text,
        "price": item.find("div", attrs={"class": "discount_final_price"}).text,
        "genre": item.find("div", attrs={"class": "tab_item_top_tags"}).text
    }
    print(itemObject)

Я ожидаю таких результатов, какэто, но более 1 результатов:

{
    'name': 'Little Misfortune', 
    'price': '$19.99', 
    'genre': 'Adventure, Indie, Casual, Singleplayer'
}

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Убедитесь, что вы работаете с детьми, поэтому добавьте дочерний элемент a для селектора.Вы также можете сделать родительский элемент row, например, #NewReleasesRows

from bs4 import BeautifulSoup
import requests
import json

url = 'https://store.steampowered.com/tags/en/Adventure/#p=0&tab=NewReleases'
response = requests.get(url, timeout=9)
content = BeautifulSoup(response.content, "html.parser")
for item in content.select('#NewReleasesRows a'):
    itemObject = {
        "name": item.find("div", attrs={"class": "tab_item_name"}).text,
        "price": item.find("div", attrs={"class": "discount_final_price"}).text,
        "genre": item.find("div", attrs={"class": "tab_item_top_tags"}).text
    }
    print(itemObject)
0 голосов
/ 19 сентября 2019

Я думаю, вы не выбираете правильный тег.Вместо этого используйте NewReleasesRows, чтобы найти таблицу, содержащую строки новых выпусков.Таким образом, код будет выглядеть следующим образом с помощью селектора CSS:

my_soup: BeautifulSoup = BeautifulSoup(my_page_text, 'lxml')
print("mysoup type:", type(my_soup))

my_table_list = my_soup.select('#NewReleasesRows')
print('my_table_list size:', len(my_table_list))

Затем вы можете искать строки (проверив, что у вас есть только одна таблица (также можно использовать select_one):

print(BeautifulSoup.prettify(my_table_list[0]))
my_table_rows = my_table_list[0].select('.tab_item')

и оттуда вы можете выполнить итерацию

for my_row in my_table_rows:
    print(my_row.get_text(strip=True))

Код результата: R 130.00 Небольшое несчастье, приключения, инди, казуальные игры, одиночная игра -33% R 150.00R 100.50TrailmakersBuilding, Sandbox, Multiplayer, LEGO -10% R 105.00R94.50 Колода Девила 秘境 秘境 Ранний доступ, Ролевые игры, Инди, Ранний доступ R 89.00 Бандитизм, Действие, Приключения, Инди, Ужасы R 150.00HardlandAdventure, Инди, Открытый мир, Одиночная игра R 120.00 Игра EndCard, Стратегия, Инди, Приключение R 105.00Atomorf2Casual,, Инди, Приключения -10% R 175.00R 157.50Daymare: 1998Indie, Action, Survival Horror, Ужасы -25% R 79.00R 59.25Ling: Дорожные действия, RPG, Инди, Гор -10% R 105.00R 94.50NauticrawlIndie, Simulation, Simulation,Атмосферный, Научно-фантастический FreeOrpheus's DreamFree to Play, Приключения, Инди, Казуальные игры -40% R 105.00R 63.00AVAEarly Access, Action, EarlyAccess, Indie -40% R 18.00R 10.80Angry GolfIndie, Казуальные игры, Спорт, Приключения -40% R 10.00R 6.00Death LiveIndie, Casual, Приключения, Аниме -30% R 130.00R 91.00Die YoungSurvival, Экшн, Открытый мир, Гора

Надеюсь, это поможет.Лучший

0 голосов
/ 19 сентября 2019

Проблема в том, что content.findAll("div", attrs=....... содержит все нужные вам результаты в самом первом индексе (results [0]), поэтому вы получите только первый результат.Когда вы перебираете это;Вы только один раз просматриваете HTML-файл, содержащий полезные материалы, поэтому возникает одна проблема.Решение состоит в том, чтобы затем найти найденный html-блок, содержащий желаемые результаты, и разделить ТО на итерацию, с которой вы можете работать.Вот мое решение:

from bs4 import BeautifulSoup
import requests
import json
url = 'https://store.steampowered.com/tags/en/Adventure/#p=0&tab=NewReleases'
response = requests.get(url, timeout=9)
content = BeautifulSoup(response.content, "html.parser")
bulk = content.find("div", attrs={"id": "tab_content_NewReleases"})  # Isolate the block you want
results = bulk.findAll('a', attrs={'class': 'tab_item'})  # Split it into the seperate results
for item in results:
    itemObject = {
        "name": item.find("div", attrs={"class": "tab_item_name"}).text,
        "price": item.find("div", attrs={"class": "discount_final_price"}).text,
        "genre": item.find("div", attrs={"class": "tab_item_top_tags"}).text
    }
    print(itemObject)

Вы прошли 90% пути, просто пропустив этот маленький кусочек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...