Получение заголовков из html (парсинг) - PullRequest
0 голосов
/ 10 июля 2020

Источник: https://en.wikipedia.org/wiki/COVID-19_pandemic_in_the_United_States. Я хочу использовать таблицу под названием «COVID-19 pandemi c в США по штатам и территориям», которая является третьей диаграммой на странице. Вот мой код на данный момент

from bs4 import BeautifulSoup
import pandas as pd
with open("COVID-19 pandemic in the United States - Wikipedia.htm", "r", encoding="utf-8") as fd:
    soup=BeautifulSoup(fd)
    print(soup.prettify())

all_tables = soup.find_all("table")
print("The total number of tables are {} ".format(len(all_tables)))
data_table = soup.find("div", {"class": 'mw-stack stack-container stack-clear-right mobile-float-reset'})
print(type(data_table))
sources = data_table.tbody.findAll('tr', recursive=False)[0]

sources_list = [td for td in sources.findAll('td')]

print(len(sources_list))
data = data_table.tbody.findAll('tr', recursive=False)[1].findAll('td', recursive=False)
data_tables = []

for td in data:

    data_tables.append(td.findAll('table'))
header1 = [th.getText().strip() for th in data_tables[0][0].findAll('thead')[0].findAll('th')]

header1

Эта последняя строка с header1 я выдаю мне ошибку «индекс списка вне допустимого диапазона» . Предполагается, что он напечатает «Штат или территория США ...»

Я ничего не знаю о html, и все это меня сбивает с толку. Кроме того, soup.find может ссылаться не на ту часть веб-страницы.

Ответы [ 3 ]

0 голосов
/ 11 июля 2020

Можете ли вы просто использовать

headers = [element.text.strip() for element in data_table.find_all("th")]

, чтобы получить текст в заголовках?

Чтобы получить всю таблицу как pandas фрейм данных, вы можете:

import pandas as pd
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_file)
data_table = soup.find("div", {"class": 'mw-stack stack-container stack-clear-right mobile-float-reset'})
rows = data_table.find_all("tr")

# Delete first row as it's not part of the table and confuses pandas
# this removes it from both soup and data_table
rows[0].decompose()
# Same for third row
rows[2].decompose()
# Same for last two rows
rows[-1].decompose()
rows[-2].decompose()

# Read html with pandas
df = pd.read_html(str(data_table))[0]

# Keep only the useful columns
df = df[['U.S. state or territory[i].1', 'Cases[ii]', 'Deaths', 'Recov.[iii]', 'Hosp.[iv]']]

# Rename columns
df.columns = ["State", "Cases", "Deaths", "Recov.", "Hosp."]

0 голосов
/ 11 июля 2020

В этих случаях, вероятно, проще попытаться прочитать оттуда таблицы с pandas и go:

import pandas as pd

table = soup.select_one("div#covid19-container table")
df = pd.read_html(str(table))[0]
df

Результатом является целевая таблица.

0 голосов
/ 10 июля 2020

посмотрев на ваш код, я думаю, вам следует называть тег html с помощью find, а не find_all в теге заголовка

...