Как отделить HTML от таблицы Википедии с чистым выводом данных, используя BeautifulSoup? - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь написать сценарий, который удаляет данные со страницы Википедии, содержащей несколько таблиц данных об ураганах

Здесь я импортирую пакет BeautifulSoup для анализа html

from bs4 import BeautifulSoup
import requests
import pandas as pd
html = requests.get("https://en.wikipedia.org/wiki/List_of_Category_4_Atlantic_hurricanes").text #grabing the html from wikipedia
soup = BeautifulSoup(html, 'html5lib') #creating a soup object that allows for searching via tags

Здесь я используюфункция soup.find_all для выбора класса таблицы.Я ссылаюсь на 5-ю таблицу в квадратных скобках

table = soup.find_all('table', class_="wikitable")[5] 

Здесь я обрезаю информацию строки заголовка, используя понимание списка

headers = [header.text.strip() for header in table.find_all('th',{'scope' :'col'})] 
rows=[] 

Здесь я перебираю строку таблицы и извлекаю данные таблицы идобавьте его в переменную строк

for row in table.find_all('tr'): 
rows.append([val.text.encode('utf-8').rstrip() for val in row.find_all(['td', 'th'])])

data = pd.DataFrame.from_records(rows, columns=headers) #Creating a panads dataframe
data2 = data.drop(data.index[0]) #droping the first row as it is a dublicate of the column header
data2.head() #viewing the data frame

Выходные данные из фрейма данных не очень чистые, однако для полей данных, считываемых как "b'Hurricane Iris' " , "b'October\xc2\xa08\xe2\x80\x939'" , "b'948\xc2\xa0mbar (hPa; 27.99\xc2\xa0inHg)'". Does anyone have a solution that results in a data frame with cleaner data? Thanks!

Изображение заголовка фрейма данных

1 Ответ

0 голосов
/ 23 октября 2018

pandas имеет специальный метод для чтения HTML таблиц в DataFrames - он называется pd.read_html().

Если вы запустите эту функцию для переменной html, она будетвернуть список DataFrame объектов, где каждый объект представляет собой один HTML таблица .

Из вашего кода кажется, что вы хотите получить шестой HTML таблица :

all_tables_in_dataframes = pd.read_html(html)
the_sixth_table_as_dataframe = all_tables_in_dataframes[5]

Вы можете добавить header=0 к pdf.read_html(), чтобы установить первый ряд в качестве заголовков:

all_tables_in_dataframes = pd.read_html(html, header=0)

pd.read_html() не будетвсегда работают идеально, и есть некоторые предостережения, о которых вы можете прочитать в документации .Но, как я понимаю, в целом это хорошо работает для таблиц из Википедии.

...