在Python dict中将表头分配为键

时间:2015-12-22 18:35:31

标签: python python-2.7 selenium xpath selenium-webdriver

我目前在Selenium中填充Python中的列表,包含所有表行值。

我想现在,在每行数据的末尾放置一个中断,并使用表头作为键。我不确定如何最好地表示字典中的表格数据。但我唯一的要求是我可以通过表和行标题查询它(行标题是每行中的第一个值)。

表格......

shinyServer(function(input, output) {

data <- reactive({ 

    validate(
        need(input$data != "", "Please select a data set")
    )
    get(input$data, 'package:datasets') 

})


output$plot <- renderPlot({
    hist(data()[, 1], col = 'forestgreen', border = 'white')
})

output$table <- renderTable({
    warning("Warning message.")
    head(data())
})

})

我在简化表中包含了colspan,类等,以防它们有用。

<table class="confluenceTable tablesorter">
    <thead>
        <tr class="sortableHeader">
            <th data-column="0" class="confluenceTh sortableHeader tablesorter-headerSortDown">
                <div class="tablesorter-header-inner">First Name</div>
            </th>
            <th data-column="1" colspan="1" class="confluenceTh sortableHeader">
                <div class="tablesorter-header-inner">Last Name</div>
            </th>
            <th data-column="2" class="confluenceTh sortableHeader">
                <div class="tablesorter-header-inner">Function</div>
            </th>
        </tr>
    </thead>
    <tbody class="">
        <tr>
            <td colspan="1" class="confluenceTd">John</td>
            <td colspan="1" class="confluenceTd">Smith</td>
        </tr>
        <tr>
            <td colspan="1" class="confluenceTd"><span>Jane</span></td>
            <td colspan="1" class="confluenceTd"><span>Doe</span></td>
        </tr>
    </tbody>
</table>

使用上面的python我可以得到

def get_test_data(driver):
    table = driver.find_element_by_xpath("//table")
    rawdata = []
    for td in table.find_elements_by_tag_name('td'):
        rawdata.append(td.text)
    pprint(rawdata)

我想要

[u'John',
 u'Smith',
 u'Jane',
 u'Doe']

或类似的东西,所以我可以在字典中查询数据。

2 个答案:

答案 0 :(得分:2)

使用我提到的html代码段:

assign_headers.py

的一部分
first_names  = map(lambda el: el.text, browser.find_elements_by_xpath('//tr/td[1]'))
second_names = map(lambda el: el.text, browser.find_elements_by_xpath('//tr/td[2]'))
headers      = map(lambda el: el.text, browser.find_elements_by_xpath('//th/div'))

print [{headers[0]: first_names[i], headers[1]: second_names[i]} for i in range(len(first_names))]

行动中:

In [1]: run assign_headers.py
[{u'Last Name': u'Smith', u'First Name': u'John'}, {u'Last Name': u'Doe', u'First Name': u'Jane'}]

答案 1 :(得分:-1)

这应该有用 - 它没有经过测试但应该接近:

rawdata = []
headdata = []
for tr in table.find_elements_by_tag_name('tr'):
    tmp = {}
    for th in tr.find_elements_by_tag_name('th'):
        headdata.append(append(th.text)

    ii = 0
    for td in tr.find_elements_by_tag_name('td'):
        tmp[headdata[ii]] = td.text
        ii += 1        

    rawdata.append(tmp)

你可以从thead获取标题,从tbody获取tr行