#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. Большое тебе спасибо, Сушил. Вы очень помогли!