为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

汪汪一只猫 2023-09-11 17:07:22
好的,我正在为我的大学编程课程做一个自我指导的学期项目。我的计划是抓取《守望先锋联赛》网站的不同部分以获取统计数据等,将它们保存在数据库中,然后使用不和谐机器人从该数据库中提取数据。但是,我遇到了网站本身的问题。这是排行榜页面 html 的屏幕截图。正如您所看到的,它非常复杂,并且很难使用重复的 div 和 body 标签进行导航,而且我很确定它是动态创建的。我的教授建议我找到一种方法来隔离表格顶部的排名标题,然后访问父行,然后遍历兄弟行,将团队名称、位置等数据暂时提取到字典中。我在网上找不到任何对我有帮助的东西,大多数网站没有提供足够的信息或已经过时。这是我到目前为止所拥有的:from bs4 import BeautifulSoupimport requestsimport linkimport reimport pprinturl = 'https://overwatchleague.com/en-us/standings'response = requests.get(url).textpage = 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知识,所以如果可能的话我会尽量避免它。即使您可以就如何解决此问题提出一些建议,我也会非常感激。谢谢
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

正如您所注意到的,您的数据采用 JSON 格式。它直接嵌入到页面中的脚本标记中,因此很容易使用它美丽汤。然后你需要解析json以提取所有表(对应3个选项卡):


import requests

from bs4 import BeautifulSoup

import json


url = '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个选项卡的标题,值是表数据


查看完整回答
反对 回复 2023-09-11
  • 1 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信