2015-12-21 2 views
1

Я использовал Selenium, чтобы соскрести динамическую таблицу Javascript с информацией о положении и зарплате федерального сотрудника от http://www.fedsdatacenter.com/federal-pay-rates/index.php?n=&l=&a=SECURITIES+AND+EXCHANGE+COMMISSION&o=&y=all. (Примечание: все данные общедоступного домена, поэтому не беспокойтесь: личная информация).Создать DataFrame из скремблированного списка таблиц Javascript

Я пытаюсь получить его в Pandas DF для анализа. Моя проблема заключается в том, что мой вкладе Селена данные представляет собой список, который печатает как:

[u'DOE,JON'], [u'14'], [u'SK'], [u'$176,571.00'], [u'$2,000.00'], [u'SECURITIES AND EXCHANGE COMMISSION'], [u'WASHINGTON'], [u'GENERAL ATTORNEY'], [u'2012']], ... 

То, что я хочу, чтобы добраться до этого DF, который обрабатывает произвольное количество записей как:

NAME  GRADE SCALE SALARY  BONUS  AGENCY LOCATION POSITION YEAR 
Doe, Jon 14 SK $176,571.00 $2,000.00 SEC DC  ATTY  2012 
. 
. 
. 

I» вы пытались преобразовать этот список в словарь, используя функцию zip() с именами col в виде кортежа, а данные как список и т. д. - все это безрезультатно, хотя это была хорошая экскурсия по функциям Python. Каким должен быть следующий шаг после получения данных или я должен читать данные по-другому?

В настоящее время код скребок:

from selenium import webdriver 

path_to_chromedriver = '/Users/xxx/Documents/webdriver/chromedriver' # change path as needed 
browser = webdriver.Chrome(executable_path = path_to_chromedriver) 

url = 'http://www.fedsdatacenter.com/federal-pay-rates/index.php' 
browser.get(url) 

inputAgency = browser.find_element_by_id('a') 
inputYear = browser.find_element_by_id('y') 

# Send data 
inputAgency.send_keys('SECURITIES AND EXCHANGE COMMISSION') 
inputYear.send_keys('All') 

# Select 'All' from Years element 
browser.find_element_by_css_selector('input[type=\"submit\"]').click() 
browser.find_element_by_xpath('//*[@id="example_length"]/label/select/option[4]').click() 

SMRtable = browser.find_element_by_id('example') 

scrapedData = [] 

for td in SMRtable.find_elements_by_xpath('.//td'): 
    scrapedData.append([td.get_attribute('innerHTML')]) 
    print td.get_attribute('innerHTML') 

ответ

1

Вы можете использовать pandas только.

Итак, сначала вы можете проверить вид страницы источника страницы:

http://www.fedsdatacenter.com/federal-pay-rates/index.php?n=&l=&a=SECURITIES+AND+EXCHANGE+COMMISSION&o=&y=all

Проверить линии нет. 14807 - 14826:

// data table initialization 
$(document).ready(function() { 
    $('#example').dataTable({ 
     "bPaginate": true, 
     "bFilter": false, 
     "bProcessing": true, 
     "bServerSide": true, 
     "aoColumns": [ 
     null, 
     null, 
     null, 
     { "sType": 'currency' }, // set currency columns to allow sorting 
     { "sType": 'currency' }, // set second column to currency to allow sorting 
     null, 
     null, 
     null, 
     null 
     ], 
     "sAjaxSource": "output.php?n=&a=SECURITIES AND EXCHANGE COMMISSION&l=&o=&y=all" 
    }); 
}); 

Это означает, что эта страница использует dataTables и данные загружаются из АЯКС источника в формате JSON.

Так вместо того, чтобы слом HTML, вы можете получить чистый хороший JSON:

output.php?n=&a=SECURITIES AND EXCHANGE COMMISSION&l=&o=&y=all 

И заключительная ссылка (вместо space использование %20):

http://www.fedsdatacenter.com/federal-pay-rates/output.php?n=&a=SECURITIES%20AND%20EXCHANGE%20COMMISSION&l=&o=&y=all

JSON:

{"sEcho":0,"iTotalRecords":"7072900","iTotalDisplayRecords":"19919","aaData":[ 
["ZUVER,SHAHEEN H","14","SK","$170,960.00","$0.00","SECURITIES AND EXCHANGE COMMISSION","WASHINGTON","GENERAL ATTORNEY","2014"], 
["ZUR,MIA C.","14","SK","$164,875.00","$0.00","SECURITIES AND EXCHANGE COMMISSION","WASHINGTON","GENERAL ATTORNEY","2014"], 
["ZUNDEL,JENNET LEONG","14","SK","$204,638.00","$0.00","SECURITIES AND EXCHANGE COMMISSION","SAN FRANCISCO","ACCOUNTING","2014"], 
["ZUKOWSKI,DAVID W","04","SK","$38,382.00","$0.00","SECURITIES AND EXCHANGE COMMISSION","BOSTON","ADMIN AND OFFICE SUPPORT STUDENT TRAINEE","2014"], 
... 

Таким образом, вы можете использовать е это JSON по панд с read_json:

import pandas as pd 

df = pd.read_json("http://www.fedsdatacenter.com/federal-pay-rates/output.php?n=&a=SECURITIES%20AND%20EXCHANGE%20COMMISSION&l=&o=&y=all") 
print df.head() 
               aaData iTotalDisplayRecords \ 
0 [ZUVER,SHAHEEN H, 14, SK, $170,960.00, $0.00, ...     19919 
1 [ZUR,MIA C., 14, SK, $164,875.00, $0.00, SECUR...     19919 
2 [ZUNDEL,JENNET LEONG, 14, SK, $204,638.00, $0....     19919 
3 [ZUKOWSKI,DAVID W, 04, SK, $38,382.00, $0.00, ...     19919 
4 [ZOU,FAN, 14, SK, $166,650.00, $0.00, SECURITI...     19919 

    iTotalRecords sEcho 
0  7072900  0 
1  7072900  0 
2  7072900  0 
3  7072900  0 
4  7072900  0 

После этого вы получите новый DataFrame из колонки aaData - список использование понимание:

df1 = pd.DataFrame([ x for x in df['aaData'] ]) 

Набор колонок имена:

df1.columns = ['NAME','GRADE','SCALE','SALARY','BONUS','AGENCY','LOCATION','POSITION','YEAR'] 

print df1.head() 
        NAME GRADE SCALE  SALARY BONUS \ 
0  ZUVER,SHAHEEN H 14 SK $170,960.00 $0.00 
1   ZUR,MIA C. 14 SK $164,875.00 $0.00 
2 ZUNDEL,JENNET LEONG 14 SK $204,638.00 $0.00 
3  ZUKOWSKI,DAVID W 04 SK $38,382.00 $0.00 
4    ZOU,FAN 14 SK $166,650.00 $0.00 

           AGENCY  LOCATION \ 
0 SECURITIES AND EXCHANGE COMMISSION  WASHINGTON 
1 SECURITIES AND EXCHANGE COMMISSION  WASHINGTON 
2 SECURITIES AND EXCHANGE COMMISSION SAN FRANCISCO 
3 SECURITIES AND EXCHANGE COMMISSION   BOSTON 
4 SECURITIES AND EXCHANGE COMMISSION  WASHINGTON 

            POSITION YEAR 
0       GENERAL ATTORNEY 2014 
1       GENERAL ATTORNEY 2014 
2        ACCOUNTING 2014 
3 ADMIN AND OFFICE SUPPORT STUDENT TRAINEE 2014 
4   INFORMATION TECHNOLOGY MANAGEMENT 2014 
+0

Это здорово, спасибо! Вам нужно лучше понять Javascript там. – user2559269

+0

На самом деле, найдено еще одно ограничение, которое может потребовать соскабливания - в то время как «iTotalDisplayRecords»: «19919», фактический фрейм данных, который получается из этого, содержит только 100 строк, соответствующих максимальной опции из 100 строк, которые элемент выбора строки позволяет. Знаете ли вы об этом? – user2559269

+1

вы можете попробовать этот url 'http://www.fedsdatacenter.com/federal-pay-rates/output.php?n = & a = ЦЕННЫЕ БУМАГИ% 20AND% 20EXCHANGE% 20COMMISSION & l = & o = & y = all & sEcho = 4 & iColumns = 9 & sColumns = & iDisplayStart = 0 & iDisplayLength = 100000' и, возможно, попробуйте изменить последний номер '100000' – jezrael

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