Как получить таблицу с сайта python
Перейти к содержимому

Как получить таблицу с сайта python

  • автор:

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

собственно здесь я все это ищу

Не могу разобраться, как можно спарсить таблицу на этом сайте 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, то будет просто чудесно.

Как спарсить все данные таблицы сайта?

Есть сайт, с которого нужно спарсить информацию обо всех банках. Таблица показывает данные только по одному банку. Для показа других банков необходимо в селекторе выбрать другой банк, а так же квартал и год, за который нужна информация. После нужно все данные занести в CSV файл. Прикладываю свой код Python

import requests from bs4 import BeautifulSoup import csv headers = < "Accept": "*/*", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" >with open("index.html", encoding='utf-8') as file: pars = file.read() soup = BeautifulSoup(pars, 'lxml') tablecaption = soup.find('div', class_='table-caption').find_all('div') with open(f"table_results.csv", "w", encoding="utf-8") as file: writer = csv.writer(file, delimiter=',') for tc in tablecaption: writer.writerow( ( tc ) ) tablehead = soup.find("table", class_="first-col-fixed-table stat").find_all("th") name = tablehead[0].text.strip() startdate = tablehead[1].text.strip() finishdate = tablehead[2].text.strip() with open(f"table_results.csv", "a", encoding="utf-8") as file: writer = csv.writer(file, delimiter=',') writer.writerow( ( name, startdate, finishdate ) ) banks = soup.find('div', class_='select').find_all('option') with open(f"table_results.csv", "a", encoding="utf-8") as file: writer = csv.writer(file, delimiter=',') for bank in banks: writer.writerow( bank ) # tablerow = soup.find('tbody').find_all('tr') # tablerow.remove(tablerow[0]) # tablerow.remove(tablerow[14]) # tablerow.remove(tablerow[22]) # with open(f"table_results.csv", "a", encoding="utf-8") as file: # writer = csv.writer(file, delimiter=',') # for tr in tablerow: # td = tr.find_all("td") # article = td[0].text.replace(u'\xa0', ' ').lstrip("\n") # # data1 = td[1].text.replace(u'\xa0', ' ').lstrip("\n") # # data2 = td[2].text.replace(u'\xa0', ' ').lstrip("\n") # writer.writerow( # ( # article, # # data1, # # data2 # ) # )

Буду благодарен, если поможете, ибо не могу решить эту проблему давно, а времени все меньше. Хотя бы какую документацию посмотреть или видеоуроки.

  • Вопрос задан более года назад
  • 83 просмотра

1 комментарий

Средний 1 комментарий

Нужно спарсить таблицу с сайта?

Здравствуйте! Я начинающий программист и мне нужно спарсить таблицу с сайта —> https://opi.dfo.kz/p/ru/DfoObjects/objects/teaser-.
Честно говоря не понимаю как ее спарсить уже ломаю голову 3 часа, прошу помочь разобраться или иначе я сам не смогу понять, что тут делать, я гуглил смотрел как делают другие, но взрыв мозга.

  • Вопрос задан более трёх лет назад
  • 1624 просмотра

9 комментариев

Простой 9 комментариев

kshnkvn

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

SeRzZzJ

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

SeRzZzJ

Сергей Романюк @SeRzZzJ Автор вопроса

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

kshnkvn

SeRzZzJ, ты видимо не понял к чему мы клоним. Поясню цитатой из правил п. 5.12 данного ресурса:

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

Пока ты не предоставишь собственные попытки решения своей собственной проблемы, твой «вопрос» расценивается как задание, что запрещено правилами данного ресурса.

SeRzZzJ

Сергей Романюк @SeRzZzJ Автор вопроса

Ivan Yakushenko, есть код, но работает криво и не правильно, я получаю всю информацию без разделения в один словарь, а как сделать иначе хотел узнать тут

kshnkvn

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

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

Алан Гибизов @phaggi Куратор тега Python

Твоя проблема в том, что ты не читаешь документацию. Вот и сейчас ты наплевал на документацию по нашему ресурсу.
Предлагаю для начала прочесть документацию ресурса и задать вопрос правильно, с положенным оформлением и с уважением к читателям.

Нужно уважать тех, от кого ты зависишь, и любить тех, кто от тебя зависит. А так, как делаешь ты. ничего хорошего у тебя не выйдет.

Решения вопроса 1

hottabxp

Сергей Карбивничий @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, обязательно закрываем открытый файл.

Получение данных c веб-сайта без API в 3 строки кода на Python

Обложка поста Получение данных c веб-сайта без API в 3 строки кода на Python

Рассказываем о том, как можно сэкономить время и нервы при автоматизации процесса получения данных с веб-сайтов без соответствующего API-интерфейса.

Предположим, что в поисках данных, необходимых для вашего проекта, вы натыкаетесь на такую веб-страницу:

Вот они — все необходимые данные для вашего проекта.

Но что же делать, если нужные вам данные находятся на сайте, который не предоставляет API для их получения? Конечно же, можно потратить несколько часов и написать обработчик, который получит эти данные и преобразует их в нужный для вашего приложения формат.

Но есть и более простое решение — это библиотека Pandas и ее встроенная функция read_html() , которая предназначена для получения данных с html-страниц.

import pandas as pd tables = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/") print(tables[0]) 

Прим. перев. В данной статье используется версия Pandas 0.20.3

Да, все настолько просто. Pandas находит html-таблицы на странице и возвращает их как новый объект DataFrame .

Теперь попробуем указать Pandas, что первая (а точнее нулевая) строка таблицы содержит заголовки столбцов, а также попросим ее сформировать datetime -объект из строки, находящейся в столбце с датой и временем.

import pandas as pd calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"]) print(calls_df) 

На выходе мы получим следующий результат:

Call Date Call Type Street Cross Streets Unit 0 2017-06-02 17:27:58 Medical HIGHLAND AV WIGHTMAN ST/UNIVERSITY AV E17 1 2017-06-02 17:27:58 Medical HIGHLAND AV WIGHTMAN ST/UNIVERSITY AV M34 2 2017-06-02 17:23:51 Medical EMERSON ST LOCUST ST/EVERGREEN ST E22 3 2017-06-02 17:23:51 Medical EMERSON ST LOCUST ST/EVERGREEN ST M47 4 2017-06-02 17:23:15 Medical MARAUDER WY BARON LN/FROBISHER ST E38 5 2017-06-02 17:23:15 Medical MARAUDER WY BARON LN/FROBISHER ST M41 

Теперь все эти данные находятся в DataFrame -объекте. Если же нам нужны данные в формате json, добавим еще одну строчку кода:

import pandas as pd calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"]) print(calls_df.to_json(orient="records", date_format="iso")) 

В результате вы получите данные в формате json с правильным форматированием даты по стандарту ISO 8601:

[ < "Call Date": "2017-06-02T17:34:00.000Z", "Call Type": "Medical", "Street": "ROSECRANS ST", "Cross Streets": "HANCOCK ST/ALLEY", "Unit": "M21" >, < "Call Date": "2017-06-02T17:34:00.000Z", "Call Type": "Medical", "Street": "ROSECRANS ST", "Cross Streets": "HANCOCK ST/ALLEY", "Unit": "T20" >, < "Call Date": "2017-06-02T17:30:34.000Z", "Call Type": "Medical", "Street": "SPORTS ARENA BL", "Cross Streets": "CAM DEL RIO WEST/EAST DR", "Unit": "E20" >// и т.д. ] 

При желании данные можно сохранить в CSV или XLS:

import pandas as pd calls_df, = pd.read_html("http://apps.sandiego.gov/sdfiredispatch/", header=0, parse_dates=["Call Date"]) calls_df.to_csv("calls.csv", index=False) 

Выполните код и откройте файл calls.csv . Он откроется в приложении для работы с таблицами:

Получение данных c веб-сайта без API в 3 строки кода на Python 1

И, конечно же, Pandas упрощает анализ:

calls_df.describe() 
Call Date Call Type Street Cross Streets Unit count 69 69 69 64 69 unique 29 2 29 27 60 top 2017-06-02 16:59:50 Medical CHANNEL WY LA SALLE ST/WESTERN ST E1 freq 5 66 5 5 2 first 2017-06-02 16:36:46 NaN NaN NaN NaN last 2017-06-02 17:41:30 NaN NaN NaN NaN 
calls_df.groupby("Call Type").count() 
Call Date Street Cross Streets Unit Call Type Medical 66 66 61 66 Traffic Accident (L1) 3 3 3 3 

И обработку данных:

calls_df["Unit"].unique() 

Результат метода unique :

array(['E46', 'MR33', 'T40', 'E201', 'M6', 'E34', 'M34', 'E29', 'M30', 'M43', 'M21', 'T20', 'E20', 'M20', 'E26', 'M32', 'SQ55', 'E1', 'M26', 'BLS4', 'E17', 'E22', 'M47', 'E38', 'M41', 'E5', 'M19', 'E28', 'M1', 'E42', 'M42', 'E23', 'MR9', 'PD', 'LCCNOT', 'M52', 'E45', 'M12', 'E40', 'MR40', 'M45', 'T1', 'M23', 'E14', 'M2', 'E39', 'M25', 'E8', 'M17', 'E4', 'M22', 'M37', 'E7', 'M31', 'E9', 'M39', 'SQ56', 'E10', 'M44', 'M11'], dtype=object) 

Теперь вы знаете, как с помощью Python и Pandas можно быстро получить данные с практически любого сайта, не прилагая особых усилий. Освободившееся время предлагаем посвятить чтению других интересных материалов по Python на нашем сайте.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *