Объединение 3-х bs4.element.ResultSet в один мастер ResultSet - PullRequest
0 голосов
/ 25 октября 2018

Я пишу скрипт на Python, чтобы очистить 100 лучших игр от metacritic.com.

Я использовал bs4 findAll () для создания ResultSet для списка элементов с {"class": "product_row game"}.

Когда я проверял len (prods), он возвращался "98" .После осмотра я заметил, что первый и последний элементы в списке имеют {"class": "product_row game first"} и {"class": "product_row game last"} соответственно.

Я планировал создать 3 отдельных ResultSet и объединить их, но я не могу найти в Интернете ресурсы для этого.Это реально / умно сделать это было?Если так, указатель будет оценен.Если нет, то как мне изменить свой подход?

Заранее спасибо, Гэвин :) 100 *

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup as soup

url = 'https://www.metacritic.com/browse/games/score/metascore/all/all/filtered?sort=desc'

req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})

web_byte = urlopen(req).read()
webpage = web_byte.decode('utf-8')
urlopen(req).close()

page_soup = soup(webpage, "html.parser")

prod_f = page_soup.findAll("div", {"class":"product_row game first"})
prods = page_soup.findAll("div", {"class":"product_row game"})
prod_l = page_soup.findAll("div", {"class":"product_row game last"})

Ответы [ 4 ]

0 голосов
/ 25 октября 2018

Я пишу скрипт на Python, чтобы очистить 100 лучших игр от metacritic.com.

divs = page_soup.find_all('div',{'class':'product_rows'})
temp_df = pd.DataFrame(columns=['A','B','C','D','E'])

pos = 0
for row in divs[0].find_all('div',{'class':'product_row'}):
    data = []
    for item in row.find_all('div',{'class':'product_item'}):
        clean_data = item.text.strip() 
        clean_data = clean_data.replace('\n',' ')
        data.append(clean_data)
    temp_df.loc[pos] = data  
    pos+=1

print(temp_df.head())

Вывод

       A   B                                                  C          D  \
0  1.  99  The Legend of Zelda: Ocarina of Time          ...  User: 9.1   
1  2.  98  Tony Hawk's Pro Skater 2                      ...  User: 7.4   
2  3.  98  Grand Theft Auto IV                           ...  User: 7.5   
3  4.  98  Red Dead Redemption 2                         ...  User: tbd   
4  5.  98  SoulCalibur                                   ...  User: 8.7   

              E  
0  Nov 23, 1998  
1  Sep 20, 2000  
2  Apr 29, 2008  
3  Oct 26, 2018  
4   Sep 8, 1999
0 голосов
/ 25 октября 2018

Вы можете объединить их все в один ResultSet, добавив одну строку:

prods.extend([prod_f, prod_l])

Если вы запустите print(len(prods)), теперь у него есть все 100 элементов

0 голосов
/ 25 октября 2018

Если то, что вы ищете, это просто «получить все div, у которых есть класс product_row и class game», то использование CSS-селектора, вероятно, лучший подход:

prods = page_soup.select('div.product_row.game')

Ссылки на документацию:

0 голосов
/ 25 октября 2018

Вы не упоминаете, почему вы хотите объединить три.Но если вы хотите перебрать все элементы, вы можете использовать itertools.chain:

import itertools

node_iterator = itertools.chain([prod_f], prods, [prod_l])
for node in node_iterator:
    do_whatever_with(node)

Обратите внимание, что find() возвращает объект Tag, а findAll() возвращаетResultSet объект, который может быть повторен для получения Tag объектов.Поскольку itertools.chain ожидает, что все аргументы будут итеративными, я создаю список Tag объектов, используя [prod_f] / [prod_l] в примере кода выше.

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