Python Splinter возвращает текст и пустые значения с разделителем

В настоящее время я использую find_by_xpath в осколке для получения всех значений таблицы. Он отлично работает для получения всех непустых значений и занимает мало времени. Однако некоторые ячейки таблицы пусты, и следующий код игнорирует эти ячейки. Кроме того, мне нужен разделитель (возможно, вертикальная черта - '|'?) между каждым значением.

browser.find_by_xpath("//*[contains(text(),'Table of Data')]/..").value

Вот пример результата из первой строки:

'col1 data col2 data col3 data'

Мне нужно это, потому что 4-й столбец (но иногда и другие столбцы) имеет пустую ячейку:

'col1 data|col2 data|col3 data|""'

Заранее спасибо!

HTML:

<td class="padtd" height="150" valign="top" width="75%" colspan="2">
   <div class="headingSum">Table of Data </div>
   <table style="width:100%;height=10;valign:top">
<tbody>
   <tr>
      <td height="15" width="50%" class="selTabSum">
         <div>
         <table style="width:100%;" valign="top">
            <tbody>
               <tr>
                  <td width="10%" class="tableheading">Column 1</td>
                  <td width="15%" class="tableheading">Column 2 </td>
                  <td width="25%" class="tableheading">Column 3 </td>
                  <td width="50%" class="tableheading">Column 4 </td>
               </tr>
               <tr>
                  <td width="10%" valign="top" class="tableCell"><a href=""><span class=“data” id="160042">col1 data</span></a></td>
                  <td width="15%" valign="top" class="tableCell">col2 data</td>
                  <td width="25%" valign="top" class="tableCell">col3 data</td>
                  <td width="50%" class="tableCell"></td>
               </tr>
               <tr>
                  <td width="10%" valign="top" class="tableCell"><a href=""><span class=“data” id="160042">col1 data</span></a></td>
                  <td width="15%" valign="top" class="tableCell">col2 data</td>
                  <td width="25%" valign="top" class="tableCell">col3 data</td>
                  <td width="50%" class="tableCell"></td>
               </tr>
               <tr>
                  <td width="10%" valign="top" class="tableCell"><a href=""><span class=“data” id="97851">col1 data</span></a></td>
                  <td width="15%" valign="top" class="tableCell">col2 data</td>
                  <td width="25%" 
                     valign="top" class="tableCell">col3 data</td>
                  <td width="50%" class="tableCell">
                     col4 data
                     <table width="100%">
                        <tbody>
                           <tr></tr>
                        </tbody>
                     </table>
                  </td>
               </tr>
            </tbody>
         </table>
      </td>

person Dance Party    schedule 31.12.2020    source источник


Ответы (2)


Используя только селен и питон, вы можете добиться следующего:

# Retrieve the headers of each cell
table_headers = [el.text for el in driver.find_elements_by_css_selector("table td.tableheading")]
table_row = []
table = []

for tr in driver.find_elements_by_css_selector("table table tr"):
    cells = [el.text for el in tr.find_elements_by_css_selector('td.tableCell')]
    if len(cells) > 0:
        table_row.append(cells)

# Create your table [row, dict of header/value]
for row in table_row:
    table.append(dict(zip(table_headers, row)))

Выход:

[{'Column 1': 'col1 data',
  'Column 2': 'col2 data',
  'Column 3': 'col3 data',
  'Column 4': ''},
 {'Column 1': 'col1 data',
  'Column 2': 'col2 data',
  'Column 3': 'col3 data',
  'Column 4': ''},
 {'Column 1': 'col1 data',
  'Column 2': 'col2 data',
  'Column 3': 'col3 data',
  'Column 4': 'col4 data'}]
[{'Column 1': 'col1 data',
  'Column 2': 'col2 data',
  'Column 3': 'col3 data',
  'Column 4': ''},
 {'Column 1': 'col1 data',
  'Column 2': 'col2 data',
  'Column 3': 'col3 data',
  'Column 4': ''},
 {'Column 1': 'col1 data',
  'Column 2': 'col2 data',
  'Column 3': 'col3 data',
  'Column 4': 'col4 data'}]
person Nic Laforge    schedule 31.12.2020

В итоге я получил HTML из таблицы (через xpath) и передал его пандам через pd.read_html.

import pandas as pd
from splinter import Browser
...
xp = "//*[contains(text(),'Table of Data')]/.."
df = pd.read_html(browser.find_by_xpath(xp).html)[1]
person Dance Party    schedule 01.01.2021