#python #pandas #beautifulsoup #python-requests
Вопрос:
Я новичок в Pandas
и Webscraping
и BeautifulSoup
в Python.
Поскольку я учился выполнять некоторые базовые веб-работы на Python с помощью requests
и BeautifulSoup
для очистки веб-страницы, меня смущает задача присвоения 2-го и 3-го элементов таблицы html в фрейм данных pandas.
Предположим, у меня есть этот стол:
Вот мой код до сих пор:
import pandas as pd from bs4 import BeautifulSoup import requests html_data = requests.get('https://en.wikipedia.org/wiki/List_of_largest_banks').text soup = BeautifulSoup(html_data, 'html.parser') data = pd.DataFrame(columns=["Name", "Market Cap (US$ Billion)"]) for row in soup.find_all('tbody')[3].find_all('tr'): #This line will make sure to get to the third table which is this "By market capitalization" table on the webpage and finding all the rows of this table col = row.find_all('td') #This is to target individual column values in a particular row of the table for j, cell in enumerate(col): #Further code here
Как видно, я хочу настроить таргетинг на все значения 2-го и 3-го столбцов строки и добавить их в пустой data
фрейм данных, чтобы data
он содержал названия банков и значения рыночной капитализации. Как я могу добиться такой функциональности?
Ответ №1:
Для таблиц я бы предложил pandas
:
import pandas as pd url = 'https://en.wikipedia.org/wiki/List_of_largest_banks' tables = pd.read_html(url) df = tables[1]
Когда вы предпочитаете использовать beautifulsoup
, вы можете попробовать сделать то же самое:
url = 'https://en.wikipedia.org/wiki/List_of_largest_banks' r = requests.get(url) soup = BeautifulSoup(r.content, 'html.parser').find_all('table') table = soup[1] table_rows = table.find_all('tr') table_header = [th.text.strip() for th in table_rows[0].find_all('th')] table_data = [] for row in table_rows[1:]: table_data.append([td.text.strip() for td in row.find_all('td')]) df = pd.DataFrame(table_data, columns=table_header)
При необходимости вы можете установить Rank
в качестве индекса с. df.set_index('Rank', inplace=True
Изображение ниже представляет собой неизмененный кадр данных.
Комментарии:
1. в дополнение к ответу на вопрос -gt; gt;
data = pd.read_html(url)[1].iloc[:,1:]
пока.iloc[:,1:]
будет разделена колонка «ранг»2. Кажется, мне немного сложно понять :/