我有一个谷歌表与冠状病毒数据。我想用worldometers网站更新它。我不想在我的代码中复制数千个单元格中的每一个CSS选择器。
我试着得到这个表格,但它在每个单元格后都用换行符隔开。我用下面的代码得到了这个表格
import bs4
import requests
res = requests.get('https://www.worldometers.info/coronavirus')
soup = bs4.BeautifulSoup(res.text, 'html.parser')
print(len(soup.select('table')))
txt = soup.select('table')[1]
print(txt.text)
有没有一种方法可以让我们从表中得到的int一种格式,可以放到excel中,或者把表html本身放到excel中,这样就会有正确的格式。
我建议你看看下面的python模块。
希望这些资源能帮到你。
编辑:下面的代码(基于 这个)应该允许你检索表。
import pandas as pd, openpyxl, os.path
if os.path.isfile("coronaData.xlsx") == False:
openpyxl.Workbook().save("coronaData.xlsx")
url = "https://www.worldometers.info/coronavirus"
hdr = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
"X-Requested-With": "XMLHttpRequest"
}
#See https://stackoverflow.com/questions/45943179/python-pandas-typeerror-first-argument-must-be-string-or-compiled-pattern#45944194
key = str(frozenset(hdr.items()))
table = pd.read_html(url, key)[0]
table.to_excel("coronaData.xlsx")
然而,我一直遇到以下错误信息 urllib.error.HTTPError: HTTP Error 403: Forbidden
这也许可以用正确的标题(hdr)来解决。也许用另一个网站会更容易一些(没有hdr和关键变量,比如说。维基百科).
我想我找到了问题的答案。我做了一些研究,发现如何通过追加每一行来使其成为一个CSV文件。我也可以用这个方法取人口。在我得到CSV文件后,我只是把它放在我的谷歌驱动器,并将其转换为谷歌表。代码如下图所示。
import bs4
import requests
import csv
res = requests.get('https://www.worldometers.info/coronavirus')
soup = bs4.BeautifulSoup(res.text, 'html.parser')
print(len(soup.select('table')))
txt = soup.select('table')[1]
txt2 = bs4.BeautifulSoup(requests.get('https://www.worldometers.info/world-
population/population-by-country/').text,
'html.parser').select('table')[0]
output_covidrows = []
output_populatoinrows = []
for table_row2 in txt2.findAll('tr'):
columns2 = table_row2.findAll('td')
output_row2 = []
for column2 in columns2:
output_row2.append(column2.text.strip())
output_populatoinrows.append(output_row2)
for table_row in txt.findAll('tr'):
columns = table_row.findAll('td')
output_row = []
for column in columns:
output_row.append(column.text.strip())
for populationentry in output_populatoinrows:
if len(populationentry) < 2 or len(output_row) < 2:
continue
if populationentry[1] == output_row[0]:
output_row.append(populationentry[2])
output_row.append(populationentry[9])
if len(output_row) > 2:
output_covidrows.append(output_row)
with open('output.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(
['Country', 'Total Cases', 'New Cases', 'Total Deaths', 'New Deaths',
'Total Recovered', 'Active Cases',
'Serious Cases', 'Tot Cases per 1m', 'Deaths per 1m', 'Total tests',
'Tests per 1m', 'Region', 'Population',
'Med Age'])
writer.writerows(output_covidrows)
print('Done')