Beautiful Soup 网页抓取复杂的 html 数据

好的,我正在为我的大学编程课程做一个自我指导的学期项目。我的计划是抓取《守望先锋联赛》网站的不同部分以获取统计数据等,将它们保存在数据库中,然后使用不和谐机器人从该数据库中提取数据。但是,我遇到了网站本身的问题。这是排行榜页面 html 的屏幕截图

正如您所看到的,它非常复杂,并且很难使用重复的 div 和 body 标签进行导航,而且我很确定它是动态创建的。我的教授建议我找到一种方法来隔离表格顶部的排名标题,然后访问父行,然后遍历兄弟行,将团队名称、位置等数据暂时提取到字典中。我在网上找不到任何对我有帮助的东西,大多数网站没有提供足够的信息或已经过时。

这是我到目前为止所拥有的:

from bs4 import BeautifulSoup

import requests

import link

import re

import pprint


url = 'https://overwatchleague.com/en-us/standings'


response = requests.get(url).text


page = BeautifulSoup(response, features='html.parser')




# for stat in page.find(string=re.compile("rank")):

#     statObject = {

#         'standing' : stat.find(string=re.compile, attrs={'class' : 'standings-table-v2styles__TableCellContent-sc-3q1or9-6 jxEkss'}).text.encode('utf-8')

#     }


# print(page.find_all('span', re.compile("rank")))  


# for tag in page.find_all(re.compile("rank")):

    # print(tag.name)


print(page.find(string=re.compile('rank')))


"""

# locate branch with the rank header,

# move up to the parent branch

# iterate through all the siblings and 

# save the data to objects

"""

评论都是失败的尝试,并且没有任何返回。唯一没有注释掉的行返回一个巨大的 json,其中包含许多不必要的信息,其中确实包括我想要解析并用于我的项目的内容。我已将其链接为谷歌文档,并突出显示了我想要获取的内容。

我现在不太确定还有什么办法可以解决这个问题。我考虑过使用selenium,但是我缺乏javascript知识,所以如果可能的话我会尽量避免它。即使您可以就如何解决此问题提出一些建议,我也会非常感激。

谢谢


汪汪一只猫
浏览 54回答 1
1回答

富国沪深

正如您所注意到的,您的数据采用 JSON 格式。它直接嵌入到页面中的脚本标记中,因此很容易使用它美丽汤。然后你需要解析json以提取所有表(对应3个选项卡):import requestsfrom bs4 import BeautifulSoupimport jsonurl = 'https://overwatchleague.com/en-us/standings'r = requests.get(url)soup = BeautifulSoup(r.text, "html.parser")script = soup.find("script",{"id":"__NEXT_DATA__"})data = json.loads(script.text)tabs = [    i.get("standings")["tabs"]    for i in data["props"]["pageProps"]["blocks"]     if i.get("standings") is not None]result = [    { i["title"] : i["tables"][0]["teams"] }    for i in tabs[0]]print(json.dumps(result, indent=4, sort_keys=True))上面的代码给你一个字典,键是3个选项卡的标题,值是表数据
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Html5