Получение HTML-таблицы через pandas read_html не сработает

Что работает

Мне удалось получить данные из таблицы hmtl через pd.read_html вот так:

In[1]:

import numpy as np
import pandas as pd
from tabulate import tabulate

URL = "https://coinmarketcap.com/all/views/all/"
df_in_list = pd.read_html(URL, attrs = {'id': 'currencies-all'})

# df_in_list has the df in element 0
df_raw = df_in_list[0]  
df = df_in_list[0]  

df = df[['#', 'Name', 'Symbol', 'Market Cap', 'Price' ]]

print(tabulate(df.head(), headers='keys', tablefmt='psql'))
Out[1]:

+----+-----+------------------+----------+-----------------+-----------+
|    |   # | Name             | Symbol   | Market Cap      | Price     |
|----+-----+------------------+----------+-----------------+-----------|
|  0 |   1 | BTC Bitcoin      | BTC      | $95,224,161,781 | $5398.69  |
|  1 |   2 | ETH Ethereum     | ETH      | $19,256,205,102 | $182.34   |
|  2 |   3 | XRP XRP          | XRP      | $15,031,762,618 | $0.359679 |
|  3 |   4 | LTC Litecoin     | LTC      | $5,530,275,811  | $90.24    |
|  4 |   5 | BCH Bitcoin Cash | BCH      | $5,514,209,793  | $311.17   |
+----+-----+------------------+----------+-----------------+-----------+

Нашел идентификатор div с помощью инструментов Chrome dev:

<table class = "table floating-header summary-table 
js-summary-table dataTable no-footer" 
id = "currencies-all"   <!-- this is what I need -->
style = "font-size: 14px; width: 100%;" role = "grid">

Что не работает

Сейчас пытаюсь получить данные с другого URL, но безуспешно. URL-адрес:

https://coinmarketcap.com/currencies/bitcoin/исторические-данные/?start=20130428&end=20190410

Таблица находится в этом div:

<div id = "historical-data" class = "tab-pane active">

Мой код таков:


In[2]:

import numpy as np
import pandas as pd
from tabulate import tabulate

URL = "https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130428&end=20190410"
df_in_list = pd.read_html(URL, attrs = {'id': 'historical-data'})

# df_in_list has the df in element 0
df_raw = df_in_list[0]  
df = df_in_list[0]  

df = df[['#', 'Name', 'Symbol', 'Market Cap', 'Price' ]]

print(tabulate(df.head(), headers='keys', tablefmt='psql'))
Out[2]:

ValueError: No tables found

Что мне не хватает?

Редактировать

Очевидно, что в этом интересующем меня div нет тега table:

<div id = "historical-data" class = "tab-pane active">

Это причина ошибки?

Если да, то как еще я могу получить данные, находящиеся в этом div?

Редактировать 2

Я знаю, что у coinmarketcap.com есть API, но я предпочитаю получать данные с их сайта.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 929
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, у вас неправильный class за столом.

Если вы измените df_in_list на df_in_list = pd.read_html(URL, attrs = {'class': 'table'}), это должно сработать.

Вам также придется изменить часть df = df[['#', 'Name', 'Symbol', 'Market Cap', 'Price' ]], так как этих столбцов нет в новой таблице, которую вы очищаете.

Превосходно! Спасибо.

Ugur 10.04.2019 22:04

Другие вопросы по теме