Python爬取网页时BeautifulSoup找不到浏览器inspector显示的tbody原因
问题原因分析
- 浏览器的自动补全机制:HTML标准规定
<table>的直系子元素应为<thead>、<tbody>、<tfoot>三类标签。你看到的原始HTML里<table>下直接放了<tr>属于不规范的写法,浏览器在渲染页面时会自动给没有包裹的行数据套上一层<tbody>标签,所以元素审查工具里能看到这个自动生成的节点。 - BeautifulSoup的解析逻辑差异:你初始化BeautifulSoup对象时没有指定解析器,默认调用Python内置的
html.parser,该解析器不会主动补全缺失的<tbody>标签,因此解析得到的<table>节点下直接就是<tr>节点,调用table.tbody返回空值,触发属性报错。
修复方案
你可以任选以下两种方案解决问题:
- 直接调整节点查找逻辑,跳过不存在的
<tbody>层,将代码中的table.tbody.find_all('tr')修改为table.find_all('tr')即可。如果需要过滤掉表头的行,可以额外加判断条件排除<thead>下的<tr>。 - 改用支持HTML结构补全的解析器:先安装
lxml库,命令为pip install lxml,之后初始化BeautifulSoup时指定解析器:soup = BeautifulSoup(web_content.text, 'lxml'),lxml会和浏览器一样自动补全缺失的<tbody>标签,原有查找逻辑无需修改即可正常运行。
内容的提问来源于stack exchange,提问作者CezarySzulc
相关产品推荐
相关产品推荐

