Scrape Wikipedia Using Python, Красивый суп - PullRequest
1 голос
/ 20 марта 2020

У меня есть некоторые проблемы с вики-столом, и я надеюсь, что кто-то, кто делал это раньше, может дать мне совет. Из таблицы wikitable mw-collapsible мне нужно получить данные в pandas фреймах данных. (Код не работает). Я не уверен, как это сделать. В этой первоначальной попытке получить данные это ValueError: Длина значений не соответствует длине индекса. Буду признателен за вашу помощь!

import urllib.request
url = "https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_South_Africa"
page = urllib.request.urlopen(url)
from bs4 import BeautifulSoup
soup = BeautifulSoup(page, "lxml")

# use the 'find_all' function to bring back all instances of the 'table' tag in the HTML and store in 'all_tables' variable
all_tables=soup.find_all("table")
all_tables

right_table=soup.find('table', class_='wikitable mw-collapsible')
right_table

A=[]
B=[]
C=[]
D=[]
E=[]
F=[]
G=[]
H=[]
I=[]
J=[]
K=[]
L=[]
M=[]
N=[]
O=[]
P=[]
Q=[]
U=[]

for row in right_table.findAll('tr'):
    cells=row.findAll('td')
    if len(cells)==17:
        A.append(cells[0].find(text=True))
        B.append(cells[1].find(text=True))
        C.append(cells[2].find(text=True))
        D.append(cells[3].find(text=True))
        E.append(cells[4].find(text=True))
        F.append(cells[5].find(text=True))
        G.append(cells[6].find(text=True))
        H.append(cells[7].find(text=True))
        I.append(cells[8].find(text=True))
        J.append(cells[9].find(text=True))
        K.append(cells[10].find(text=True))
        L.append(cells[11].find(text=True))
        M.append(cells[12].find(text=True))
        N.append(cells[13].find(text=True))
        P.append(cells[14].find(text=True))
        Q.append(cells[15].find(text=True))
        U.append(cells[16].find(text=True))

import pandas as pd
df=pd.DataFrame(A,columns=['DATE'])
df['EC']=B
df['FS']=C
df['GAU']=D
df['KJN']=F
df['LIM']=G
df['MPU']=H
df['NW']=I
df['NC']=J
df['WC']=K
df['NEW']=L
df['TOTAL']=M
df['NEW']=N
df['TOTAL']=O
df['REC']=P
df['TESTED']=Q
df['REF']=U
df

1 Ответ

1 голос
/ 20 марта 2020

Огромная работа, чтобы попасть в информационный фрейм, когда pandas имеет функцию read_html(), чтобы сделать это точно (фактически использует Beautifulsoup под капотом).

.read_html() вернет список фреймов данных (Ie теги <table> в html). Это просто вопрос вытаскивания того, который вы хотите.

import pandas as pd
url = "https://en.wikipedia.org/wiki/2020_coronavirus_pandemic_in_South_Africa"

dfs = pd.read_html(url)
df = dfs[3]

Вывод:

print (df.to_string())
          Date   EC   FS     GP   KZN   LP   MP   NW   NC    WC Confirmed        Deaths                                                         Rec                        Tested                           Ref
          Date   EC   FS     GP   KZN   LP   MP   NW   NC    WC       New  Total    New                         Total                           Rec                        Tested                           Ref
0   2020-03-04  NaN  NaN    NaN   NaN  NaN  NaN  NaN  NaN   NaN       NaN    0.0    NaN                           NaN                           NaN                           181                          [22]
1   2020-03-05  NaN  NaN    NaN   1.0  NaN  NaN  NaN  NaN   NaN       1.0    1.0    NaN                           NaN                           NaN                           NaN                           [2]
2   2020-03-06  NaN  NaN    NaN   NaN  NaN  NaN  NaN  NaN   NaN       0.0    1.0    NaN                           NaN                           NaN                           NaN                           NaN
3   2020-03-07  NaN  NaN    1.0   NaN  NaN  NaN  NaN  NaN   NaN       1.0    2.0    NaN                           NaN                           NaN                           NaN                          [11]
4   2020-03-08  NaN  NaN    NaN   1.0  NaN  NaN  NaN  NaN   NaN       1.0    3.0    NaN                           NaN                           NaN                           NaN                          [23]
5   2020-03-09  NaN  NaN    NaN   4.0  NaN  NaN  NaN  NaN   NaN       4.0    7.0    NaN                           NaN                           NaN                           NaN                          [24]
6   2020-03-10  NaN  NaN    2.0   1.0  NaN  NaN  NaN  NaN   NaN       3.0   10.0    NaN                           NaN                           NaN                           239                          [25]
7   2020-03-11  NaN  NaN    2.0   NaN  NaN  NaN  NaN  NaN   1.0       3.0   13.0    NaN                           NaN                           NaN                           645                      [12][26]
8   2020-03-12  NaN  0.0    1.0   1.0  NaN  1.0  NaN  NaN   NaN       3.0   16.0    NaN                           NaN                           NaN                           848                  [27][28][29]
9   2020-03-13  NaN  NaN    4.0   2.0  NaN  NaN  NaN  NaN   2.0       8.0   24.0    NaN                           NaN                           NaN                           924                      [30][31]
10  2020-03-14  NaN  NaN    7.0   1.0  NaN  NaN  NaN  NaN   6.0      14.0   38.0    NaN                           NaN                           NaN                          1017                      [32][33]
11  2020-03-15  NaN  NaN    7.0   1.0  NaN  NaN  NaN  NaN   5.0      13.0   51.0    NaN                           NaN                           NaN                          1476                   [34][3][35]
12  2020-03-16  NaN  NaN    7.0   NaN  1.0  1.0  NaN  NaN   2.0      11.0   62.0    NaN                           NaN                           NaN                          2405                      [17][36]
13  2020-03-17  NaN  NaN   14.0   4.0  NaN  NaN  NaN  NaN   5.0      23.0   85.0    NaN                           NaN                           NaN                          2911                      [18][37]
14  2020-03-18  NaN  NaN   16.0   3.0  NaN  2.0  NaN  NaN  10.0      31.0  116.0    NaN                           NaN                           NaN                          3070                  [38][19][39]
15  2020-03-19  NaN  NaN   15.0   3.0  NaN  1.0  NaN  NaN  15.0      34.0  150.0    NaN                           NaN                           NaN                          4832                  [40][41][42]
16  2020-03-20  NaN  7.0   33.0   1.0  NaN  NaN  NaN  NaN  11.0      52.0  202.0    NaN                           NaN                             2                          6438                      [43][44]
17         NaN  NaN  NaN    NaN   NaN  NaN  NaN  NaN  NaN   NaN       NaN    NaN    NaN                           NaN                           NaN                           NaN                           NaN
18       Cases  0.0  7.0  109.0  24.0  1.0  5.0  0.0  0.0  56.0       NaN    NaN    NaN  including local transmission  including local transmission  including local transmission  including local transmission
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...