【问题标题】:Assign table headers as keys in Python dict将表头分配为 Python dict 中的键
【发布时间】:2016-03-29 02:26:07
【问题描述】:

我目前让 Selenium 在 Python 中填充一个列表,其中包含所有表行值。

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

对于表...

<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>

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

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)

用上面的python我可以得到

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

我想得到

  {
  "First Name": "John",
  "LastName": "Smith"
  },
  {
  "First Name": "Jane",
  "Last Name": "Doe"
  }

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

【问题讨论】:

  • 问题已被投票 ;-)

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


【解决方案1】:

使用您的html sn-p 我想出了:

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'}]

【讨论】:

  • 谢谢@drets 这让我非常接近。我想知道您是否可以提供帮助,我的页面上有第二个表格,其中 td 数据被扫入字典。我如何只查看第一个表而不给它一个类或 id?
  • 尝试将table[1] 或table[2](取决于您要选择的表)添加到xpath 选择器(例如//table[1]//tr/td[1])。
  • 我复制了你的“示例”html sn-p 2 次(所以页面中有 2 个表),我只能使用 xpath 选择器中的 table[1]/ 前缀从第一个表中选择数据,正如我提到的以上。
  • 不幸的是不适合我。如果你有时间,我还有另一个问题。我的表格被简化了,实际上我正在查看//table[1]//tr/td[9] 和//table[1]//tr/td[10]。如何将标题与这些值匹配? //table[1]//th/[9]' 不起作用。
  • 不,我没有时间在 cmets 中提出其他问题,抱歉!
【解决方案2】:

这应该可以 - 它没有经过测试,但应该很接近:

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 行

【讨论】:

  • 它不起作用,我得到一个未使用的变量 th 和 ii 上的语法错误
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 2019-04-06
  • 2017-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
相关资源
最近更新 更多