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

Не могу разобраться, как можно спарсить таблицу на этом сайте 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 часа, прошу помочь разобраться или иначе я сам не смогу понять, что тут делать, я гуглил смотрел как делают другие, но взрыв мозга.
- Вопрос задан более трёх лет назад
- 1395 просмотров
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, обязательно закрываем открытый файл.
Как запарсить элементы таблицы?
Нужно запарсить элементы из этой таблицы (получить сведения о работе — заявки, цена и прочее). Но я не могу никак достать элементы из таблицы.
# 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()

Вообще, я правильно понял, что это нужный тэг? Просто я не нашёл таблицу.
- Вопрос задан более трёх лет назад
- 12530 просмотров
12 комментариев
Простой 12 комментариев
Парсинг веб-сайтов с помощью pandas и Python с помощью всего нескольких строк кода.
Парсинг веб-сайтов не должен быть сложным, особенно если вы знаете Python.
Динамические веб-сайты можно парсить с помощью таких библиотек, как Selenium, Scrapy и др. Предоставляем вам полное описание библиотек для парсинга сайтов, их преимущества и недостатки в использовании. Простые веб-сайты можно парсить с помощью BeautifulSoup, а сверх простые сайты можно парсить только с помощью pandas.
И нам нужна всего одна или две строки кода, чтобы парсить сайты с pandas.
В этой статье мы собираемся собрать данные из Wikipedia.
Мы извлечем групповые таблицы с чемпионата мира по футболу FIFA 2022. Есть 8 таблиц от группы A до группы H, и мы получим из с помощью нескольких строк кода, используя pandas и Python.

Первое, что необходимо сделать, установить библиотеки и зависимости.
Первым делом мы установим библиотеки pandas и string.
pandas будут использоваться для извлечения данных, а модуль string поможет нам лучше организовать извлеченные данные.
pip install pandas pip install strings
Примечание: Для веб-сканирования с pandas нам также необходимо установить некоторые зависимости, такие как lxml и html5lib (мы можем установить их с помощью pip).
Парсинг сайта (одной строчкой кода)
Простые веб-сайты, такие как Wikipedia, можно легко парсить с помощью одной или двух строк кода с помощью pandas.
Для этого мы сначала должны импортировать pandas. Затем мы должны использовать метод .read_html и в скобках указать веб-сайт, который мы хотим очистить.
import pandas as pd all_tables = pd.read_html("https://en.wikipedia.org/wiki/2022_FIFA_World_Cup")
И это все. Теперь все страницы на сайте Wikipedia хранятся в списке all_tables .
Теперь нам нужно найти таблицы, которые принадлежат группам A, B, …H (всего 8 таблиц). Если мы пройдемся по элементам списка, то увидим, что первая, вторая и третья таблицы находятся в индексах 11, 18 и 25 соответственно.
all_tables[11] all_tables[18] all_tables[25]
Вот так выглядит таблица группы C (индекс 25).

Организация данных
Если мы пройдемся по индексам списка all_tables , мы обнаружим, что первая таблица имеет индекс 11, а следующие таблицы опережают на 7 индексов.
Мы можем связать все эти индексы с названием каждой группы, используя функцию zip .
for letter, i in zip(alphabet, range(11, 67, 7)): print(letter, i)
Вывод будет следующим:
A 11 B 18 C 25 D 32 E 39 F 46 G 53 H 60
Теперь мы знаем, что индекс 11 к группе A, а индекс 60 принадлежит к группе H.
Пришло время лучше организовать таблицы, извлеченные из словаря, чтобы нам больше не приходилось иметь дело с этими индексами. Мы также очистим фреймы данных, переименовав имя второго столбца «Teamvte» и удалив столбец «Qualification».
dict_tables = <> for letter, i in zip(alphabet, range(11, 67, 7)): df = all_tables[i] df.rename(columns=, inplace=True) df.pop('Qualification') dict_tables[f'Group '] = df
Теперь у нас есть все таблицы, хранящиеся в словаре dict_tables . Давайте посмотрим
>>> dict_tables.keys() dict_keys(['Group A', 'Group B', 'Group C', 'Group D', 'Group E', 'Group F', 'Group G', 'Group H'])
Мы можем получить таблицу любой группы, указав ее ключ. Вот как мы это сделаем для группы H.
dict_tables['Group H']
Так выглядит наш результат.

Вы узнали, как парсить сайты с помощью pandas. Вот весь код, который мы написали в этом уроке.
import pandas as pd from string import ascii_uppercase as alphabet all_tables = pd.read_html("https://en.wikipedia.org/wiki/2022_FIFA_World_Cup") dict_tables = <> for letter, i in zip(alphabet, range(11, 67, 7)): df = all_tables[i] df.rename(columns=, inplace=True) df.pop('Qualification') dict_tables[f'Group '] = df # show all the keys print(dict_tables.keys()) # show table of Group H dict_tables['Group H']