Вытащить таблицу из Html файла
Как вытащить даты из html файла
Есть файл с html кодом. Стандартные теги начала страницы, конца, body, head etc и в таблицах даны.
Вытащить ссылки из html-кода
В базе данных хранится данные в виде html-тегов: html: <script type="text/javascript".
Вытащить кусок html кода
Здравствуйте, помогите пожалуйста, не могу подобрать шаблон чтобы вытащить кусок html кода <div.
Вытащить русские предложения из HTML
Сделали сайт, и конечно забыли про то, что в будущем может понадобиться сделать мультиязычность. .
3323 / 2843 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
Lemfidavr, регулярные выражения — не предназначен для парсинга HTML! Исключение — такое задание дал какой-нибудь бронелобый горе-преподаватель, с которым бесполезно спорить.
Для таких целей, используйте соответствующие инструменты: Simple HTML DOM Parser, phpQuery, класс DOMDocument etc.
Регистрация: 15.11.2012
Сообщений: 87
Lazy_Den,
Это тема моего дипломного проекта.
Организовать выгрузку расписания на сайт из 1С.
Из 1С выгружается расписание(htm,excel и тд) после чего происходит отбор данных,по группам и дням недели.
На сайте будет форма в которой выбирается день недели и группа.
После чего отправляются данные на php файл по средством AJAX,обратно идет расписание.
Так как я знаком с регулярными выражениями(хоть не много,но знаком) решил сделать так.
Бибилиотеки на подобии PHPExcel учить времени нету.И тем более в excel бывает что занимает 2 ячейки,бывает одну.
3323 / 2843 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
Lemfidavr, это всё замечтательно, но задача у вас поставлена: «Вытащить таблицу из Html файла». Даже не внедряясь в какие-то библиотеки, можно элементарно обойтись классом DOMDocument. Вот вам простой пример:
1 2 3 4 5 6 7
$doc = new DOMDocument(); $doc->loadHTMLFile("myfile.html"); // путь к html-файлу $table = $doc->getElementsByTagName('table'); if (!is_null($table)) { $table_html = $doc->saveHTML($table->item(0)); } echo $table_html; // ваша таблица
Ясное дело, что таблиц может быть на странице несколько, или выбирать нужно по какому-то определенному селектору и т.д., но это уже мелкие тонкости, которые вам нужно учитывать самому в процессе работы.
Как извлечь данные из определенной ячейки html таблицы?
Здравствуйте господа умельцы =) Помогите пожалуйста решить проблему. Нужно извлечь данные из html таблицы: 1 строка, 3 столбец (Количество : 6) Нужна эта 6. Проблема в том что таблица динамическая и эта цифра 6 всегда разная.
Название товара Дата поступления Колличество Повидло 04.08.2022 6 Консервы 01.08.2022 3
- Вопрос задан более года назад
- 499 просмотров
1 комментарий
Простой 1 комментарий
Как извлечь данные из HTML таблицы?

У меня почему-то не получается извлечь данные. Как можно это сделать? Я подчеркнул что нужно достать. Вот код парсера:
def get_content(html): soup = BeautifulSoup(html, 'html.parser') items = soup.find_all('div', class_='page__content') something = [] for item in items: something.append(< 'name': item.find('td', class_='summary-data__cell').get_text(strip=True), >) print(something)
Отслеживать
51.6k 200 200 золотых знаков 61 61 серебряный знак 242 242 бронзовых знака
задан 21 мая 2021 в 13:58
human03289 human03289
27 5 5 бронзовых знаков
какой адрес страницы-донора?
21 мая 2021 в 14:32
Я не совсем понимаю, что такое адрес страницы-донора. Вот ссылка на сайт nasdaq.com/market-activity/stocks/nvda
21 мая 2021 в 14:36
@human03289, там таблица не приходит с страницей, она либо отдельным запросом подгружается, либо уже заготовлена в виде json/javascript и через javascript рендерится в таблицу html. Я бы просто сделал парсер через selenium 🙂
21 мая 2021 в 14:44
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если открыть код, который присылает страница, то можно найти только пустую заготовку для таблицы:

а сами данные прилетают позже и скриптом добавляются в нее.
import requests url = 'https://api.nasdaq.com/api/quote/NVDA/summary?assetclass=stocks' headers = r = requests.get(url, headers=headers) data = r.json()['data']['summaryData']
в data — словарь с данными для таблицы:
>>> data < 'Exchange': , 'Sector': , 'Industry': , 'OneYrTarget': , 'TodayHighLow': , 'ShareVolume': , 'AverageVolume': , 'PreviousClose': , 'FiftTwoWeekHighLow': , 'MarketCap': , 'PERatio': , 'ForwardPE1Yr': , 'EarningsPerShare': , 'AnnualizedDividend': , 'ExDividendDate': , 'DividendPaymentDate': , 'Yield': , 'Beta': >
ваше значение для Beta находится в:
>>> data['Beta']['value'] 1.38
Как вытащить табличные данные из html?
Обучаюсь написанию парсеров. Сейчас моей задачей является парсинг табличных данных с сайта https://coinmarketcap.com/ , где мне нужны непосредственно данные с таблицы криптовалют, их стоимости и т.д., которые лежат в блоке tbody.
Но когда с помощью Beautiful Soup пробую попасть в таблицу, в объект tbody, выдаёт «AttributeError: ‘NoneType’ object has no attribute ‘find_all'». При этом объект thead он видит прекрасно и никаких ошибок нет. Как мне всё таки добиться того, чтобы программа видела этот блок сайта?
Пробовал уже все возможные перестановки кода, какие-то замены в элементах, но ничего не помогает, и программа все равно не видит тело таблицы.
import requests from bs4 import BeautifulSoup import csv def get_html(url): r = requests.get(url) return r.text def write_csv(data): with open('cmc.csv', 'a') as f: writer = csv.writer(f) pass def get_page_data(html): soup = BeautifulSoup(html, 'lxml') trs = soup.find('table').find('tbody').find_all('tr') print(len(trs)) def main(): url = 'https://coinmarketcap.com/' get_page_data(get_html(url)) if __name__ == '__main__': main()

- Вопрос задан более трёх лет назад
- 2257 просмотров
5 комментариев
Простой 5 комментариев

Nikita @uptownnegative Автор вопроса
Александр, https://coinmarketcap.com/
Она есть и в описании вопроса, и в коде программы.
Александр @cashncarry
Nikita, потом увидел
Если быстро хочешь, попробуй с pandas
import pandas as pd table = pd.read_html('https://coinmarketcap.com/')[-1]
| # | Name | Market Cap | Price | Volume (24h) | Circulating Supply | Change (24h) | Price Graph (7d) | Unnamed: 8 | | |---|-------------------------------------|------------|------------------|--------------|--------------------|-----------------|------------------|------------|-----| | 0 | 1 | Bitcoin | $167,561,603,708 | $9,206.92 | $30,227,614,663 | 18,199,525 BTC | -1.01% | NaN | NaN | | 1 | 2 | Ethereum | $20,694,812,901 | $188.89 | $11,929,440,003 | 109,561,828 ETH | -0.04% | NaN | |

Nikita @uptownnegative Автор вопроса
Александр, Я хочу обучиться сначала BS, чтобы потом переходить уже к другому. И единственное, что меня сейчас волнует — это то, что я просто не могу попасть в этот объект tbody, как бы я ни пробовал.
Xpath подсказывает, что на странице аж 3 таблицы, а здесь soup.find(‘table’) явно выбирается первая из них, у которой нет тэга tbody, он есть только у третьей таблицы.

Nikita @uptownnegative Автор вопроса
AWEme, Не подумал об этом. Как изменить код, чтобы выбрать именно третью таблицу? Есть синтаксис?
Решения вопроса 1

Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
На быструю руку склепал. Не факт что код правильный, но рабочий:
Старый код:
import requests from bs4 import BeautifulSoup url = 'https://coinmarketcap.com/' r = requests.get(url) soup = BeautifulSoup(r.text, 'lxml') all = soup.find_all('',class_='cmc-table-row') for x in all: rank = x.find('td',class_='cmc-table__cell--sort-by__rank').text name = x.find('td',class_='cmc-table__cell--sort-by__name').text market_cap = x.find('td',class_='cmc-table__cell--sort-by__market-cap').text price = x.find('td',class_='cmc-table__cell--sort-by__price').text volume = x.find('td',class_='cmc-table__cell--sort-by__volume-24-h').text circulating_supply = x.find('td',class_='cmc-table__cell--sort-by__circulating-supply').text change = x.find('td',class_='cmc-table__cell--sort-by__percent-change-24-h').text print(f' ')

import requests from bs4 import BeautifulSoup url = 'https://coinmarketcap.com/' r = requests.get(url) soup = BeautifulSoup(r.text, 'lxml') all = soup.find_all('',class_='cmc-table-row') for x in all: rank = x.find('td',class_='rc-table-cell table-col-rank rc-table-cell-fix-left').text name = x.find('a',class_='cmc-link').find('p').text market_cap = x.find('td',class_='rc-table-cell font_weight_500___2Lmmi').text price = x.find('td',class_='rc-table-cell font_weight_500___2Lmmi').text volume = x.find('div',class_='Box-sc-16r8icm-0 sc-1anvaoh-0 gxonsA').a.p.text circulating_supply = x.find('p',class_='Text-sc-1eb5slv-0 kqPMfR').text # change = x.find('td',class_='cmc-table__cell--sort-by__percent-change-24-h').text print(f' ')
