首页 > 解决方案 > Python + Selenium Web 驱动程序:抓取表数据返回不完整的结果

问题描述

这是我的第一个 python 项目,希望能得到一些帮助。

我正在尝试使用 selenium 创建一个机器人来自动预约。预订网站有一个存储在 css 表中的日历,如下所示:

出现在网站上的日历

我正在尝试使用 driver.find_elements_by_xpath 从表中的每个单元格中提取所有文本,但我的代码只返回一些文本元素。

这是我正在使用的代码:

    # click specified coordinates on calendar
    click_row = 2
    click_column = 3

    target_date = driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/div[4]/div/table/tbody/tr[' + str(click_row) + ']/td[' + str(click_column) +']')
    target_date.click()

这将成功单击 7 月 6 日的日期。但我的最终目标是告诉 Selenium 单击“6”,它会自行找到第 2 行第 3 列,因此我最终将使用日历单元格内的文本编译一个数据框,对应的行和对应的列。这是我用来执行此操作的代码:

#get number of rows and columns in table
row_elements = driver.find_elements_by_xpath('/html/body/div[2]/div/div[1]/div[4]/div/table/tbody/tr')
col_elements = driver.find_elements_by_xpath('//*[@id="app"]/div/div[1]/div[4]/div/table/tbody/tr[1]/td')
num_rows = len(row_elements)
num_cols = len(col_elements)

# list to hold dates
cells_list = []
for i in range(num_rows):#pulls all text in td tags and appends to cell_list
    for row in row_elements:
        cells = row.find_elements_by_tag_name("td")[i]
        cells_list.append(cells.text)

我的代码正确地找到了日历中的行数和列数,但是在我遍历结果并附加到列表“cell_list”之后,它只输入了 25 个值。有关详细信息,请参阅输出和图片。

    print('num_rows: ' +str(num_rows))
    print('num_cols: ' +str(num_cols))
    print(cells_list)

    Out:
    >>>num_rows: 5
    >>>num_cols: 7
    >>>['27', '今天', '11', '18', '25', '28', '5', '12', '19', '26', '29', '6', '13', '20', '27', '30', '7', '14', '21', '28', '1', '8', '15', '22', '29']

什么是提取和不提取

为什么我的代码没有提取最后两列数据?

这里是网站源代码,参考网站(点击左上角显示日历):

   <div class="m-calendar">
   <div class="monthWrap">
      <div class="arrowWrap"><i class="arrow arrow-left"></i></div>
      <p>2021年07月&lt;/p>
      <div class="arrowWrap arrowWrap-right"><i class="arrow"></i></div>
   </div>
   <table class="calendarTable">
      <thead class="headerWrap">
         <tr>
            <th class="z-weekend">日&lt;/th>
            <th class="">一</th>
            <th class="">二&lt;/th>
            <th class="">三&lt;/th>
            <th class="">四&lt;/th>
            <th class="">五&lt;/th>
            <th class="z-weekend">六&lt;/th>
         </tr>
      </thead>
      <tbody class="calendarWrap">
         <tr>
            <td class="z-disabled">
               <span>27</span> <!---->
            </td>
            <td class="z-disabled">
               <span>28</span> <!---->
            </td>
            <td class="z-disabled">
               <span>29</span> <!---->
            </td>
            <td class="z-disabled">
               <span>30</span> <!---->
            </td>
            <td class="">
               <span>1</span> <!---->
            </td>
            <td class="">
               <span>2</span> <!---->
            </td>
            <td class="">
               <span>3</span> <!---->
            </td>
         </tr>
         <tr>
            <td class="z-today">
               <!----> <span>今天</span>
            </td>
            <td class="">
               <span>5</span> <!---->
            </td>
            <td class="">
               <span>6</span> <!---->
            </td>
            <td class="">
               <span>7</span> <!---->
            </td>
            <td class="z-active">
               <span>8</span> <!---->
            </td>
            <td class="">
               <span>9</span> <!---->
            </td>
            <td class="">
               <span>10</span> <!---->
            </td>
         </tr>
         <tr>
            <td class="">
               <span>11</span> <!---->
            </td>
            <td class="">
               <span>12</span> <!---->
            </td>
            <td class="">
               <span>13</span> <!---->
            </td>
            <td class="">
               <span>14</span> <!---->
            </td>
            <td class="">
               <span>15</span> <!---->
            </td>
            <td class="">
               <span>16</span> <!---->
            </td>
            <td class="">
               <span>17</span> <!---->
            </td>
         </tr>
         <tr>
            <td class="">
               <span>18</span> <!---->
            </td>
            <td class="">
               <span>19</span> <!---->
            </td>
            <td class="">
               <span>20</span> <!---->
            </td>
            <td class="">
               <span>21</span> <!---->
            </td>
            <td class="">
               <span>22</span> <!---->
            </td>
            <td class="">
               <span>23</span> <!---->
            </td>
            <td class="">
               <span>24</span> <!---->
            </td>
         </tr>
         <tr>
            <td class="">
               <span>25</span> <!---->
            </td>
            <td class="">
               <span>26</span> <!---->
            </td>
            <td class="">
               <span>27</span> <!---->
            </td>
            <td class="">
               <span>28</span> <!---->
            </td>
            <td class="">
               <span>29</span> <!---->
            </td>
            <td class="">
               <span>30</span> <!---->
            </td>
            <td class="">
               <span>31</span> <!---->
            </td>
         </tr>
      </tbody>
   </table>
</div>

标签: pythoncssselenium-webdriver

解决方案


推荐阅读