如何从 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
很多同学不会拾取,这里补充一下,用鼠标点击拾取:
这样拾取到刚刚好整个表格的框子才是对的
一般拾取完毕后,复制查找路径里面的内容,可以看到:'#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 个即可