将3个bs4.element.ResultSet组合到一个主ResultSet中

时间:2018-10-25 12:15:06

标签: python beautifulsoup

我正在编写一个Python脚本来抓取metacritic.com上排名前100的游戏。

我使用bs4 findAll()为带有{“ class”:“ product_row game”}}的元素列表创建一个ResultSet。

当我检查len(prods)时,它返回“ 98”。经过检查,我注意到列表中的第一个和最后一个元素分别具有{“ class”:“ product_row游戏第一”}和{“ class”:“ product_row游戏最后”}。

我的计划是创建3个单独的ResultSet并将它们组合在一起,但是我找不到在线资源来做到这一点。这样做是可行/明智的吗?如果是这样,将不胜感激指针。如果没有,我应该如何改变我的方法?

预先感谢, 加文:)

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 :(得分:1)

您可以通过添加一行将它们全部合并到一个ResultSet中:

prods.extend([prod_f, prod_l])

如果您运行print(len(prods)),它现在将具有全部100个项目

答案 1 :(得分:1)

  

我正在编写一个Python脚本来抓取前100个游戏中的   metacritic.com。

a = b; a += c;

输出

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())

答案 2 :(得分:0)

您没有提及为什么要将三者结合。但是,如果要遍历所有元素,则可以使用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]对象的列表。

答案 3 :(得分:0)

如果您只是简单地“获取所有具有class product_row和class game的div”,那么使用CSS选择器可能是最好的方法:

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

文档链接: