我如何得到一个表,并把它在excel中没有长的代码

问题描述 投票:0回答:1

我有一个谷歌表与冠状病毒数据。我想用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-3.x excel web-scraping css-selectors
1个回答
2
投票

我建议你看看下面的python模块。

  1. pandas:用于处理表格数据(公文, 指南将HTML表格转换为excel);
  2. openpyxl:Excel电子表格(见 本指南);
  3. EZSheets;对于谷歌电子表格(见 本指南).

希望这些资源能帮到你。

编辑:下面的代码(基于 这个)应该允许你检索表。

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和关键变量,比如说。维基百科).


0
投票

我想我找到了问题的答案。我做了一些研究,发现如何通过追加每一行来使其成为一个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')
© www.soinside.com 2019 - 2024. All rights reserved.