#python #csv #parsing #beautifulsoup #fetch
#python #csv #синтаксический анализ #beautifulsoup #извлечение
Вопрос:
Я пытаюсь извлечь и проанализировать некоторые данные из Википедии для анализа. Я пытаюсь извлечь данные для анализа корреляции между факторами в столбцах и самой оценкой счастья.
Но файл работает не так, как ожидалось. Фактически, конечный файл пуст. Я пробовал отладку, но это не сработало:
import requests
import bs4
from bs4 import BeautifulSoup
import csv
from csv import DictWriter
def get_page(url):
html_file = requests.get(url)
return html_file
def parse_html(html_file):
parsed_html = bs4.BeautifulSoup(html_file.text, 'html.parser')
t = parsed_html.find_all('table')[1]
tr = t.find_all('tr')[0]
headers = []
for header in tr:
for z in header:
if isinstance(z, bs4.element.NavigableString):
header_name = z.strip()
headers.append(header_name)
headers_original = headers
countries = []
prev_rank = ""
for ln, row in enumerate(t.find_all('tr')[2:]):
country = {}
i = 0
col_values = row.find_all('td')
while i < len(headers):
col = col_values[i]
value = col.text.strip()
if headers[i] in ('Country or region',):
value = str(value)
else:
value = float(value)
country[headers[i]] = value
i = 1
countries.append(country)
return headers, countries
def write_csv(filename, data, fieldnames):
with open(filename, 'w') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(data)
def main():
source = "https://en.wikipedia.org/wiki/World_Happiness_Report"
print(f'Fetching URL {source}...')
page = get_page(source)
print(f'Parsing {source}...')
headers, countries = parse_html(page)
print(f'Writing to a CSV file 1...')
write_csv('worldhappiness.csv', countries, headers)
print(f'Parsing table 3 (simpler table) {source} ...')
headers, countries = parse_html(page)
print(f'Writing to a CSV file 2...')
write_csv('worldhappiness2.csv', countries, headers)
print(f'Writing to a CSV file 3...')
write_csv('worldhappiness3.csv', countries, headers)
print(len(countries))
print(len(headers))
if __name__ == "__main__":
main()
Ответ №1:
Гораздо проще использовать pandas для этой цели:
import pandas as pd
tables = pd.read_html('https://en.wikipedia.org/wiki/World_Happiness_Report')
tables[4]
Результатом является ваша целевая таблица.