这是我的HTML:
import pandas as pd
html_table = '''<table>
<thead>
<tr><th>Col1</th><th>Col2</th>
</thead>
<tbody>
<tr><td>1a</td><td>2a</td></tr>
</tbody>
<tbody>
<tr><td>1b</td><td>2b</td></tr>
</tbody>
</table>'''
如果我运行df = pd.read_html(html_table)
,然后print(df[0]
,我会:
Col1 Col2
0 1a 2a
<2> Col 2消失了。为什么?怎么预防呢?
答案 0 :(得分:3)
您发布的HTML不是有效的。多个from .models import MyModel
是混淆tbody
解析器逻辑的原因。如果您无法修复输入html本身,则必须预先解析它并"unwrap"所有pandas
元素:
tbody
打印:
import pandas as pd
from bs4 import BeautifulSoup
html_table = '''
<table>
<thead>
<tr><th>Col1</th><th>Col2</th>
</thead>
<tbody>
<tr><td>1a</td><td>2a</td></tr>
</tbody>
<tbody>
<tr><td>1b</td><td>2b</td></tr>
</tbody>
</table>'''
# fix HTML
soup = BeautifulSoup(html_table, "html.parser")
for body in soup("tbody"):
body.unwrap()
df = pd.read_html(str(soup), flavor="bs4")
print(df[0])
答案 1 :(得分:0)
调用pd.read_html()时,有多个tbody标记会导致问题。拥有多个tbody标签在html5中是合法的,并且可以方便样式,但看起来它不受pd.read_html()的支持。但是,如果你可以使用单<tbody>
,它就可以正常工作。
html_table1 = '''<table>
<thead>
<tr><th>Col1</th><th>Col2</th>
</thead>
<tbody>
<tr><td>1a</td><td>2a</td></tr>
<tr><td>1b</td><td>2b</td></tr>
</tbody>
</table>'''
df1 = pd.read_html(html_table1)
print(df1)
[ Col1 Col2
0 1a 2a
1 1b 2b]