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

#python #pandas #dataframe #beautifulsoup

#python #pandas #фрейм данных #beautifulsoup

Вопрос:

Что работает

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

 <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=20130428amp;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=20130428amp;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
  

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

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

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

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

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Отлично! Спасибо.