Получение таблицы HTML через pandas read_html не будет работать - PullRequest
1 голос
/ 10 апреля 2019

Что работает

Мне удалось получить данные из таблицы 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:

<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/historical-data/?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, но я предпочитаю получать данные с их сайта.

1 Ответ

1 голос
/ 10 апреля 2019

Да, у вас неправильный class для таблицы.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...