2014-11-24 4 views
0

Я стараюсь читать таблицы цен ec2 с пандами. На основании documentation Я ожидаю список DataFrames, но получил одну таблицу в качестве списка.pandas.read_html возвращает только одну таблицу

Пример кода

import pandas 
link = 'http://aws.amazon.com/ec2/pricing/' 
data = pandas.read_html(link) 
print type(data) 
print data[0] 

Выход

<type 'list'> 
           0     1    2 
0 Reserved Instance Volume Discounts    NaN    NaN 
1   Total Reserved Instances Upfront Discount Hourly Discount 
2     Less than $250,000    0%    0% 
3    $250,000 to $2,000,000    5%    5% 
4   $2,000,000 to $5,000,000    10%    10% 
5    More than $5,000,000  Contact Us  Contact Us 

Окружающая среда:

  • Ubuntu 14,10
  • для заполнения данных в таблицах
  • питон 2.7.8
  • панды 0.14.1
+0

Что о 'типа (данные [0])'? Документы, которые вы связываете, говорят 'read_html', вернут список DataFrames, и это то, что вы получили: список, содержащий 1 DataFrame. Изучая исходный код, он выглядит как единственная истинная таблица HTML (с использованием 'tr',' td') на этом URL-адресе - это зарезервированные экземпляры тома. – wflynny

ответ

1

http://aws.amazon.com/ec2/pricing/ использует JavaScript.

В отличие от того, что вы видите, когда вы указываете ваш GUI браузер по ссылке, данные отсутствуют, если вы загрузите HTML с помощью urllib2: (. Тогда поиск содержимого для <table> тегов)

import urllib2 
response = urllib2.urlopen(link) 
content = resonse.read() 

Для обработки JavaScript вам понадобится автоматический движок браузера, такой как Selenium, или WebKit или Spidermonkey.

Здесь раствор с помощью Selenium:

import selenium.webdriver as webdriver 
import contextlib 
import pandas as pd 
@contextlib.contextmanager 
def quitting(thing): 
    yield thing 
    thing.quit() 

with quitting(webdriver.Firefox()) as driver: 
    link = 'http://aws.amazon.com/ec2/pricing/' 
    driver.get(link) 
    content = driver.page_source 
    with open('/tmp/out.html', 'wb') as f: 
     f.write(content.encode('utf-8')) 
    data = pd.read_html(content) 
    print len(data) 

дающий

238 
+0

Спасибо за указание на JavaScript, однако у меня есть проблема с вашим примером кода. Что-то не так с профилем « WebDriverException: Сообщение:« Не могу загрузить профиль. Профиль Dir:/tmp/user/1001/tmpToFbg5 » – Wawrzek

+0

Это звучит как [несовместимость между вашими версиями] (http: // stackoverflow.com/q/20957968/190597) Selenium и Firefox. – unutbu

Смежные вопросы