Python Splinter返回带分隔符的文本和空白值



我目前正在split中使用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>

只使用selenium和python,您可以实现以下目标:

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

我最终从表中获得HTML(通过xpath(,并通过pd.read_html.将其传递给panda

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]

最新更新