Парсинг таблицы сайта

Не могу разобраться, как можно спарсить таблицу на этом сайте https://coronavirus-graph.ru/rossiya/moskva Дело в том, что я хочу создать список, в котором будет отображаться статистика по дням: Дата, Заражений всего, Умерло, всего, Летальность, Выздоровело всего, Болеющих
import requests from bs4 import BeautifulSoup URL = 'https://coronavirus-graph.ru/rossiya/moskva' def get_html(url, params=None): r = requests.get(url, params=params) return r def get_content(html): soup = BeautifulSoup(html, 'html.parser') items = soup.find_all('div', class_='stat_table_box') people = [] for item in items: people.append(< 'title': item.find('tbody') .get_text() >) print(people) def parse(): html = get_html(URL) if html.status_code == 200: get_content(html.text) else: print('Error')
Отслеживать
задан 5 ноя 2021 в 1:22
Тимофей Рудковский Тимофей Рудковский
19 7 7 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если использование BeautifulSoup не есть принципиальным, то можно использовать pandas, который как раз для этого и предназначен (и не только). И код прям в две строки
>>> import pandas >>> ds = pandas.read_html("https://coronavirus-graph.ru/rossiya/moskva") >>> ds [ Дата Заражений всего Умерло всего Летальность Выздоровело всего Болеющих 0 4 ноября 18433626305 3172897 0.05% 16186246633 ➜193 010-425 1 3 ноября 18370576827 3163195 0.05% 16119916628 ➜193 435+104 2 2 ноября 18302305736 3153698 0.05% 16053636359 ➜193 331-721 3 1 ноября 18244947103 3143896 0.05% 15990045257 ➜194 052+1750 4 31 октября 18173917603 3134294 0.05% 15937475050 ➜192 302+2459 .. . . . . . . 594 20 марта 13133 — — 1 ➜130+33 595 19 марта 9812 — — 1 ➜97+12 596 18 марта 8631 — — 1 ➜85+31 597 17 марта 551 — — 1 ➜54+1 598 16 марта 5420 — — 1 ➜53+20 [599 rows x 6 columns]]
а теперь эти все данные уже находятся в удобной структуре и с ними можно делать все, что угодно. А если почитать документацию на pandas, то будет просто чудесно.
Нужно спарсить таблицу с сайта?
Здравствуйте! Я начинающий программист и мне нужно спарсить таблицу с сайта —> https://opi.dfo.kz/p/ru/DfoObjects/objects/teaser-.
Честно говоря не понимаю как ее спарсить уже ломаю голову 3 часа, прошу помочь разобраться или иначе я сам не смогу понять, что тут делать, я гуглил смотрел как делают другие, но взрыв мозга.
- Вопрос задан более трёх лет назад
- 1341 просмотр
9 комментариев
Простой 9 комментариев

Ну таблица как таблица, берешь и парсишь, с чем проблема то?

Сергей Романюк @SeRzZzJ Автор вопроса
Ivan Yakushenko, я не понимаю как к тегам таблицы обратится
а как вы пробуете и что конкретно у вас не получается?

Сергей Романюк @SeRzZzJ Автор вопроса
Stanislav Pugachev, мне нужно разбить в несколько словарей значения как в таблице, допустим как на сайте тип —> физическое лицо и записать в excel документ и я уже ломаю голову слишком долго как это осуществить

SeRzZzJ, ты видимо не понял к чему мы клоним. Поясню цитатой из правил п. 5.12 данного ресурса:
В отличие от вопроса, задача и задание представляют собой частную проблемную ситуацию с явно заданной целью, которую необходимо достичь. Пользу от достижения этой цели получает, как правило, лишь её автор. И даже автору решение задачи или задания будет полезно лишь кратковременно (до тех пор, пока он не использует полученное решение). Все остальные пользователи, которые будут просматривать вопрос, сведенный к решению частной задачи, в надежде найти ответ на свой, лишь понапрасну затратят время. Поэтому, чтобы такие вопросы-задания не мешали другим пользователям искать ответы на вопросы, нам приходится их удалять. А для поиска помощи в решении задач и выполнения заданий мы рекомендуем использовать специализированные сервисы, например «Хабр Фриланс».
Пока ты не предоставишь собственные попытки решения своей собственной проблемы, твой «вопрос» расценивается как задание, что запрещено правилами данного ресурса.

Сергей Романюк @SeRzZzJ Автор вопроса
Ivan Yakushenko, есть код, но работает криво и не правильно, я получаю всю информацию без разделения в один словарь, а как сделать иначе хотел узнать тут

SeRzZzJ, да что же до тебя вся никак не доходит: код свой покажи, который ты написал, но неправильно и тогда тебе подскажут (может быть) как нужно было сделать правильно. В этом и суть подобных ресурсов, а не что бы «сделайте за меня».

Сергей Романюк @SeRzZzJ Автор вопроса
Ivan Yakushenko,
import requests
from bs4 import BeautifulSoup
import csv
from fake_useragent import UserAgent
# get html page
def get_html(url, params=»):
r = requests.get(URL, headers=HEADERS, params=params)
return r
# we get the content of the html page
def get_content(html):
soup = BeautifulSoup(html.text, ‘html.parser’)
items = soup.find_all(‘table’, class_=’dsnode-table’)
faces = []
for item in items:
faces.append( ‘info’: item.find(‘tbody’).get_text(strip=True)
>)
return faces
#
def parser():
html = get_html(URL)
print(get_content(html))
if __name__ == ‘__main__’:
parser()

Алан Гибизов @phaggi Куратор тега Python
Твоя проблема в том, что ты не читаешь документацию. Вот и сейчас ты наплевал на документацию по нашему ресурсу.
Предлагаю для начала прочесть документацию ресурса и задать вопрос правильно, с положенным оформлением и с уважением к читателям.
Нужно уважать тех, от кого ты зависишь, и любить тех, кто от тебя зависит. А так, как делаешь ты. ничего хорошего у тебя не выйдет.
Решения вопроса 1

Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
import requests from bs4 import BeautifulSoup from lxml import html import csv headers = url = 'https://opi.dfo.kz/p/ru/DfoObjects/objects/teaser-view/25720?RevisionId=0&ReportNodeId=2147483637&PluginId=6c2aa36248f44fd7ae888cb43817d49f&ReportId=61005620' response = requests.get(url,headers=headers) file = open('data.csv','w') # Открываем файл на запись. Можно было использовать контекстный менеджер, но так думаю проще. writer = csv.writer(file) # Передаем в функцию writer дескриптор открытого файла. soup = BeautifulSoup(response.text,"html.parser") rows = soup.find('table',class_='dsnode-table').find('tbody').find_all('tr') # Ищем в html тег 'table' с классом 'dsnode-table', # далее в найденом ищем тег 'tbody' и наконец ищем все теги 'tr'. Тег 'tr' в html это тег строки таблицы. В результате, в rows # у нас окажутся все теги 'tr', тоесть все строки таблицы. for row in rows: # Проходимся по всем строкам. При каждой итерации, в row у нас будет следующая строка таблицы, вместе с html тегами. columns = row.find_all('td') # Ищем в текущей строке таблици все теги 'td'. В html td - это тег ячейки. data_list = [columns[0].text,columns[1].text,columns[2].text,columns[3].text,columns[4].text,columns[5].text,columns[6].text,columns[7].text,columns[8].text] # Так как в каждой строке 9 ячеек, а элементы списка в большинстве ЯП нумеруюются с нуля, то мы можем обратится к конкретной ячейке # текущей строки по индексу. Первая ячейка будет columns[0], а последняя, тоесть девятая - columns[8]. Создаем список 'data_list', # и заносим в него все ячейки текущей строки. Но, так как в columns кроме текстовых данных также присутствуют html теги, мы обращаемся # к свойству .text, что-бы получить сам текст, без тегов. writer.writerow(data_list) # Записываем текущую строку в csv файл. # Далее цикл продолжается, пока не достигнет конца таблицы(условно, так как все строки таблици мы уже получили, и они хранятся в 'rows') file.close() # Так как мы не используем контекстный менеджер with, обязательно закрываем открытый файл.
Читаем таблицы веб-сайтов с помощью Pandas
Данные для Data Science проектов можно получать ото всюду, в том числе и с веб-сайтов, например, страниц Википедии. Сегодня мы расскажем, как извлечь все таблицы из веб-страницы с помощью функции read_html Python-библиотеки Pandas, а также обработать полученные данные, включая нормализацию и приведение типов.
Как работает парсинг сайтов
В Pandas есть функция — read_html, которая использует одну из библиотек для парсинга веб-страниц: BeautifulSoup4, html5lib или lxml. По умолчанию в Pandas стоит lxml, однако, в случае ее отсутствия будет применяться другая. Поэтому для корректного выполнения хотя бы одна из них должна быть установлена. Установить lxml можно, выполнив следующую операцию в командной строке:
pip install lxml
Одна из перечисленных Python-библиотек ищет на указанной веб-странице все таблицы под тэгом . Внутри таблицы могут быть заголовки и сами данные под тэгами и . В результате, Pandas-функция read_html ищет все таблицы на сайте и возвращает их в виде списка в формате DataFrame.
Не всегда все таблицы получается получить в приемлемом виде: могут быть проблемы с заголовками, типами данных, кодировкой. Поэтому прежде всего их необходимо будет обработать. Мы покажем, как в Python получить таблицы с Википедии со страницы пандемии COVID-19 и обработать их.
Извлечение таблиц
Вызовем функцию read_html, передав аргументом ссылку на страницу. Ниже приведён код в Python. Всего библиотека lxml нашла 17 таблиц.
import pandas as pd
tables = pd.read_html( ‘https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BD%D0%B4%D0%B5%D0%BC%D0%B8%D1%8F_COVID-19′)
Выберем на странице таблицу со статистикой заболеваний по странам и территориям. Поскольку искать её среди 17 таблиц утомительно, мы воспользуемся регулярными выражениями. Для этого передадим аргумент match с подходящим регулярным выражением, например, «стран». Код на Python выглядит следующим образом:
tables = pd.read_html( ‘https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D0%BD%D0%B4%D0%B5%D0%BC%D0%B8%D1%8F_COVID-19′, match=’стран’)
Статистика заболеваний по странам и территориям
Всего нашлось 3 таблицы, которые содержат в своем заголовке слово «стран». Нужная нам находится под индексом 1. Однако таблица выглядит не лучшим образом: появился ещё один столбец, заполненный только NaN, название одного из столбцов содержит HTML-код, возможно нам не требуется результирующий заголовок на 2 уровне и ещё много чего. Исправим это.
Обрабатываем таблицы
В первую очередь избавимся от лишнего столбца, вызвав метод drop. Ещё мы удалим последние две строчки под номером 254 и 255, так как они содержат примечания, а не данные. Ниже представлен код на Python. Поскольку у нас двухуровневый заголовок, то и в аргументе он указывается в виде кортежа (tuple).
df.drop((‘Страны и территории’, ‘Всего 000000000000000’), axis=1, inplace=True) df.drop(axis=0, index=[254, 255], inplace=True)
Теперь отбросим нижний результирующий уровень, вызвав метод droplevel, а после этого переименуем нечитаемое название одного из столбцов в нормальное с помощью метода rename. В Python это выглядит следующим образом:
Кроме того, следует убрать источники, заключённые в квадратные скобки. Для этого мы воспользуемся методом replace, указав регулярное выражение и regex=True. Теперь таблица выглядит более приемлемо.
df.replace(, regex=True, inplace=True)
Обработанная таблица Нормализация и указание типов
Часто типом таблиц после парсинга веб-страниц является строка (str), которая в DataFrame указывается как object. Кроме того, может быть указана неизвестная кодировка. Это также следует исправить.
Исходная таблица включает подразделы: непризнанные государства, морские суда и т.д. Каждый подраздел имеет заголовок «Справочно» или «Морские суда». Мы воспользуемся этой информацией и разделим DataFrame. Прежде всего определим индексы этих заголовков и в цикле будем делить DataFrame на части, причем мы добавляем к индексу 1 каждый раз, чтобы не включать сам заголовок. Вот так выглядит Python-код:
indices = df[
(df[‘Страны и территории’].str.contains(‘Справочно’) |
df[‘Страны и территории’].str.contains(‘Морские суда’))
].index
dfs = []
cur = 0
for idx in indices:
if idx != indices[-1]:
part = df.iloc[cur:idx, :]
else:
part = df[idx+1: ]
cur = idx + 1
dfs.append(part)
Строки могут содержать нечитаемые символы, поэтому их следует нормализовать. Мы нормализуем по типу NFKC. После нормализации следует привести к соответствующему типу данных, например, float32. Но прежде всего нужно избавиться от нечисловых символов, а пробелы и «н/д» нужно заменить на Nan. В итоге, для одного из DataFrame код на Python имеет следующий вид:
temp_df = dfs[0]
temp_df.columns = temp_df.columns.str.normalize(‘NFKC’)
cols = temp_df.columns.drop(temp_df.columns[0]) # Выкинуть “Страны и территории”
for col in cols:
temp_df.loc[:, col] = temp_df.loc[:, col].str.normalize(‘NFKC’)
temp_df.loc[:, col] = temp_df.loc[:, col].replace(
, regex=True
).astype(‘float32’)
Весь приведенный код можно посмотреть в репозитории на Github.
А о том, как парсить сайты и обрабатывать полученные данные в Pandas на практических примерах Data Science, вы узнаете на нашем специализированном курсе по Python «DPREP: Подготовка данных для Data Mining на Python» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.
Как запарсить элементы таблицы?
Нужно запарсить элементы из этой таблицы (получить сведения о работе — заявки, цена и прочее). Но я не могу никак достать элементы из таблицы.
# Web-page (https://www.weblancer.net/) parser import urllib.request from bs4 import BeautifulSoup def get_html(url): response = urllib.request.urlopen(url) return response.read() def parse(html): soup = BeautifulSoup(html) table = soup.find("table", clazz="items_list") print(table) def main(): parse(get_html("https://www.weblancer.net/projects/")) if __name__ == "__main__": main()

Вообще, я правильно понял, что это нужный тэг? Просто я не нашёл таблицу.
- Вопрос задан более трёх лет назад
- 12504 просмотра
12 комментариев
Простой 12 комментариев