我正在使用pandas read_html函数将html表加载到数据帧中,但它失败了,因为source data有一个colspan = 2合并的头,导致此AssertionError:传递了6列,传递了数据7列。
我已尝试使用标题kwarg(header = None,header = ['Code'...])的各种选项,但似乎没有任何效果。
有没有人知道使用pandas read_html解析和使用合并列的html表?
答案 0 :(得分:5)
如果您不坚持使用pandas中的read_html,则此代码可以完成这项工作:
import pandas as pd
from lxml.html import parse
from urllib2 import urlopen
from pandas.io.parsers import TextParser
def _unpack(row, kind='td'):
elts = row.findall('.//%s' % kind)
return [val.text_content() for val in elts]
def parse_options_data(table):
rows = table.findall('.//tr')
header = _unpack(rows[0], kind='th')
data = [_unpack(r) for r in rows[1:]]
return TextParser(data, names=header).get_chunk()
parsed = parse(urlopen('http://www.bmfbovespa.com.br/en-us/intros/Limits-and-Haircuts-for-accepting-stocks-as-collateral.aspx?idioma=en-us'))
doc = parsed.getroot()
tables = doc.findall('.//table')
table = parse_options_data(tables[0])
这取自Wes McKinney的“Python for Data analysis”一书。
答案 1 :(得分:0)
pandas> = 0.24.0可以理解colspan
和rowspan
属性。根据{{3}}:
result = pd.read_html("""
<table>
<thead>
<tr>
<th>A</th><th>B</th><th>C</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="2">1</td><td>2</td>
</tr>
</tbody>
</table>""")
result
出局:
[ A B C
0 1 1 2
以前,这将返回以下内容:
[ A B C
0 1 2 NaN]
由于找不到URL,因此无法测试您的链接。