Как извлечь и сохранить элементы 2-й и 3-й строк во фрейме данных

#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. Кажется, мне немного сложно понять :/