python - 使用 BeautifulSoup 4.8.2 从网站上抓取表格
问题描述
我正在尝试从网站上抓取一张桌子,但它并不完全奏效。我正在使用 Python 3.7.4 和 bs4 4.8.2。另外,我不精通 HTML,所以如果我弄错了一些术语,请原谅。
我正在尝试使用“id = 'track_1_box'”来抓取父类下的表类,可以在此处看到。我试图提取的信息是字符串“title = 'Canada'”和“Cole”,但现在我什至无法访问该表。
这是我到目前为止所尝试的。
import requests
import numpy as np
from bs4 import BeautifulSoup
from csv import writer
#%%
url = 'https://www.mkleaderboards.com/mkw/charts/world/nonsc/12'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
table = soup.find("table", class_='table')
但是,“table”变量返回一个空列表。我也尝试过访问父类
soup.find_all(class_ = 'panel inline_box track_box')
返回
[<div class="panel inline_box track_box" id="track_1_box">
</div>, <div class="panel inline_box track_box" id="track_2_box">
</div>, <div class="panel inline_box track_box" id="track_3_box">
</div>, <div class="panel inline_box track_box" id="track_4_box">
</div>]
但不是四个 div 类的“内部”。
我做错了什么还是网站有什么东西阻止我刮桌子?
解决方案
数据是通过 JavaScript 加载的,但您可以使用requests
模块来获取数据:
import json
import requests
url = 'https://www.mkleaderboards.com/mkw/charts/world/nonsc/12'
api_url = 'https://www.mkleaderboards.com/api/charts/mkw_nonsc_world/{num}'
cup_id = int(url.split('/')[-1])
# box 1:
box1 = requests.get(api_url.format(num=cup_id*4+1)).json()
# box 2:
box2 = requests.get(api_url.format(num=cup_id*4+2)).json()
# box 3:
box3 = requests.get(api_url.format(num=cup_id*4+3)).json()
# box 4:
box4 = requests.get(api_url.format(num=cup_id*4+4)).json()
# uncomment this to print data to screen:
# print(json.dumps(box1, indent=4))
# print(json.dumps(box2, indent=4))
# print(json.dumps(box3, indent=4))
# print(json.dumps(box4, indent=4))
# print box1 to screen:
for d in box1['data']:
print('{:<30} {:<20} {}'.format(d['name'], d['country_name'], d['score_formatted']))
印刷:
Cole Canada 1:08.774
Kasey United States 1:08.881
SwareJonge Netherlands 1:09.036
Sosis United States 1:09.050
Paul M. United States 1:09.066
Sword United Kingdom 1:09.118
Gustav Sweden 1:09.136
Guy United States 1:09.143
Glaceon Japan 1:09.157
Liam [MKW] United Kingdom 1:09.171
推荐阅读
- android - Android - 在锁定屏幕上执行推送通知操作时提示用户输入设备密码
- linux - 使用 sip 调整一长串 jpg 文件的大小
- c# - WCF - 方法无效时如何返回值
- python - 我如何在熊猫数据框中操作小数
- python - 树莓派 python spi.open 错误 (FileNotFoundError)
- r - 如何按功能分组进行夏皮罗测试
- java - Maven 从曾祖父母而不是我们的父母依赖管理采购依赖版本
- cairo - 如何正确构造简单的重复形状图案以用作开罗的填充?
- javascript - jsfiddle问题 - 保存为html时输出不正确显示
- delphi - 如何创建类似于 TeamViewer(隐藏/显示)的交互式选项面板?