从可折叠表中抓取数据并返回空框架

时间:2020-04-06 20:43:57

标签: python beautifulsoup

尝试从此处抓取COVID案件: https://www.cdc.gov/coronavirus/2019-ncov/cases-updates/cases-in-us.html

如果点击地图下方“州”旁边的“ +”号,则会看到每个州的案件数。我希望每个州的数据框都像这样

Alabama         1841
Alaska          185
American Samoa  0

根据我的尝试,容器为空

my_url = 'https://www.cdc.gov/coronavirus/2019-ncov/cases-updates/cases-in-us.html'
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
containers = page_soup.findAll("div", {"class" : "rt-td"})

我知道我需要遍历以获取每个状态的信息,但是我需要帮助以使基本代码正常工作。这是我第一次尝试网页抓取;我很确定我使用了错误的标记或findAll参数。我尝试了几种不同的组合,但均无效果。

我发现一位女士做的事情与我在这里想要的类似: https://towardsdatascience.com/scrape-cdc-for-covid-19-cases-a162924073ad

但是我认为她是一名开发人员,她的技能超出了我的水平。必须有一种更简单的方法来执行此操作。对吧?

谢谢。

1 个答案:

答案 0 :(得分:0)

是的,这里还有更好的方法。数据作为json响应返回。只需提取json,然后使用熊猫对其进行标准化。

import requests
from pandas.io.json import json_normalize

url="https://www.cdc.gov/coronavirus/2019-ncov/map-cases-us.json"
jsonData = requests.get(url).json()

df = json_normalize(jsonData['data'])
df = df[['Jurisdiction', 'Cases Reported']].dropna()

输出:

print(df)
            Jurisdiction  Cases Reported
0                Alabama          1841.0
1                 Alaska           185.0
2         American Samoa             0.0
3                Arizona          2269.0
4               Arkansas           853.0
5             California         13438.0
6               Colorado          4950.0
7            Connecticut          5675.0
8               Delaware           673.0
9   District of Columbia           998.0
10               Florida         11961.0
11               Georgia          6752.0
12                  Guam           110.0
13                Hawaii           324.0
14                 Idaho          1101.0
15              Illinois         11256.0
16               Indiana          4411.0
17                  Iowa           868.0
18                Kansas           813.0
19              Kentucky           955.0
20             Louisiana         13010.0
21                 Maine           470.0
22      Marshall Islands             0.0
23              Maryland          4045.0
24         Massachusetts         12500.0
25              Michigan         15718.0
26            Micronesia             0.0
27             Minnesota           986.0
28           Mississippi          1738.0
29              Missouri          2367.0
30               Montana           300.0
31              Nebraska           367.0
32                Nevada          1836.0
33         New Hampshire           669.0
34            New Jersey         37505.0
35            New Mexico           624.0
36              New York        119435.0
37        North Carolina          2870.0
38          North Dakota           207.0
39     Northern Marianas             8.0
40                  Ohio          4043.0
41              Oklahoma          1250.0
42                Oregon          1068.0
43                 Palau             0.0
44          Pennsylvania         11510.0
45           Puerto Rico           475.0
46          Rhode Island           922.0
47        South Carolina          2049.0
48          South Dakota           240.0
49             Tennessee          3633.0
50                 Texas          6812.0
51                  Utah          1605.0
52               Vermont           512.0
53        Virgin Islands            42.0
54              Virginia          2878.0
55            Washington          6973.0
56         West Virginia           324.0
57             Wisconsin          2267.0
58               Wyoming           200.0

要找到这种情况(并非总是如此),但是您想转到该站点,然后右键单击并打开Inspect(Dev Tools)。然后,您要在网络-> XHR中搜索。如果为空/空白,则可能需要刷新/重新加载页面。

然后,您需要搜索/调查以查看所需数据是否存在。在这种情况下,我确实在那找到了它(如您在突出显示部分中看到的那样:

enter image description here

找到后,您可以转到Headers查找获取数据所需的相关信息/参数。

enter image description here

对于其他站点,此方法可能/将有所不同,其中一些比此更为复杂,并且某些站点根本无法工作。但这是通用方法。