我正在编写一个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"})
答案 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')
文档链接: