Как правильно размещать данные, извлеченные из Интернета, во фрейме данных pandas?

#python #pandas #beautifulsoup

#python #pandas #beautifulsoup

Вопрос:

Проблема: я использовал BeautifulSoup, чтобы очистить страницу Википедии для определения потребления мяса на душу населения для каждой страны мира. Возникли проблемы с помещением их во фрейм данных с использованием Pandas — мой фрейм данных отображается пустым.

Страница Википедии: https://en.wikipedia.org/wiki/List_of_countries_by_meat_consumption

Цель: поместить данные, извлеченные из Интернета, во фрейм данных

Код:

 url_meat1='https://en.wikipedia.org/wiki/List_of_countries_by_meat_consumption'
page=urllib.request.urlopen(url_meat1)
soup= BeautifulSoup(page, "lxml")# parse the HTML from our URL into the BeautifulSoup parse tree format
print(soup.prettify()) #print results of the web page scrape

table_meat1 = soup.find('table', class_='wikitable sortable')

A=[]
B=[]
C=[]

for row in table_meat1.findAll('tr'):
    cells=row.findAll('td')
    if len(cells)==3:
        A.append(cells[0].find(text=True))
        B.append(cells[1].find(text=True))
        C.append(cells[2].find(text=True))

df_meat1=pd.DataFrame(A,columns=['Country'])
df_meat1['kg/person (2009)']=B
df_meat1['kg/person (2017)']=C
df_meat1
  

Я получаю пустой фрейм данных…
Результат

Ответ №1:

Замените свой for цикл этим for циклом:

 for row in table_meat1.findAll('tr'):
    cells=row.find_all('td')
    if len(cells)==4:
        A.append(cells[0].a['title'])
        B.append(cells[2].find(text=True))
        C.append(cells[3].find(text=True).strip())
  

Вывод:

                  Country kg/person (2009) kg/person (2017)
0                Albania             None                 
1                Algeria             19.5            17.33
2         American Samoa             26.8                 
3                 Angola             22.4                 
4    Antigua and Barbuda             84.3                 
..                   ...              ...              ...
183            Venezuela             76.8                 
184              Vietnam             49.9            52.90
185                Yemen             17.9                 
186               Zambia             12.3                 
187             Zimbabwe             21.3            13.64

[188 rows x 3 columns]
  

Те же данные в csv файле:

введите описание изображения здесь

Комментарии:

1. Это сработало отлично! Спасибо. Можете ли вы объяснить, что вы сделали? Пытаюсь понять код.

2. Конечно… Я внес 2 изменения. 1. Изменен if len(cells)==3: на if len(cells)==4: , потому что нет ячеек с длиной 3. Все ячейки имеют длину 4,2. Изменен A.append(cells[0].find(text=True)) на A.append(cells[0].a['title']) , потому title что атрибут содержит название страны.

3. Большое тебе спасибо, Сушил. Вы очень помогли!