如何从 table 中取出数据 6.0 版本

鉴于最近太多人提如何取出数据的问题,我在这里再重新总结一下

import ubpa.iie as iie

table_string = iie.get_html(title=r'CDA会话搜索',selector=r'TABLE[class=lineTable][cellspacing=0][cellpadding=0]')
print(table_string)

查找路径 (selector) 可以用鼠标点击控件来拾取,注意要拾取整个 table,最好是 TABLE 开头的这种 selector,通过下拉可以看到多个 selector
很多同学不会拾取,这里补充一下,用鼠标点击拾取:
如何从 table 中取出数据 6.0 版本
这样拾取到刚刚好整个表格的框子才是对的
一般拾取完毕后,复制查找路径里面的内容,可以看到:
'#ListForm > DIV:nth-of-type(2) > DIV:nth-of-type(2) > TABLE:nth-of-type(1)'这种最后一个 > 后面是 TABLE 标签的,那就对了。其他还有不少对的方式,取出字符串以<TABLE>标签开头,</TABLE>标签结尾的都是对的

然后我写这个文档的主要目标来了,当 table 有多个 tbody 的时候,pandas 会出错,只解析第一个 tbody,因此我们获取了 table 后,需要预处理一下,去掉 tbody,一般来说,这个不会造成影响

import re

def remove_tbody(table_string):
    tb_start = re.compile('<tbody(.*)>')
    tb_end = re.compile('</tbody(.*)>')
    return tb_end.sub('', tb_start.sub('', table_string))

table_string = '''
<table>
  <thead>
    <th>Col1</th><th>Col2</th>
  </thead>
  <tbody 123>
    <tr><td>1a</td><td>2a</td></tr>
  </tbody>
  <tbody 234>
    <tr><td>1b</td><td>2b</td></tr>
  </tbody>
</table>
'''
print(remove_tbody(table_string))

打印的结果是:

<table>
  <thead>
    <th>Col1</th><th>Col2</th>
  </thead>
  
    <tr><td>1a</td><td>2a</td></tr>
  
  
    <tr><td>1b</td><td>2b</td></tr>
  
</table>

然后我们用 pandas 的 Dataframe 来处理 table(就是设计器中的表格)

import pandas as pd

print(pd.read_html(table_string, flavor="bs4")[0])
print('---------------')
print(pd.read_html(remove_tbody(table_string, flavor="bs4"))[0])

表格数据输出如下:

  Col1 Col2
0   1a   2a
---------------
  Col1 Col2
0   1a   2a
1   1b   2b

可以看到,如果我们不处理 tbody,那么只能得到第一个 tbody 的数据,如果处理过后,可以得到全部数据。
注意:pd.read_html输出的是一个 df 的数组,我们拾取的字符串中只有一个 table,因此访问数组中第 0 个即可