BeautifulSoup无法找到表格行求助:无法遍历HTML表格单元格
解决BeautifulSoup找不到表格
<tr>行的问题 我来帮你排查下这个问题,从你的代码和描述来看,导致找不到表格行的原因主要有以下几种可能,对应解决方案如下:
1. 表格行被嵌套在<tbody>标签内
很多标准的HTML表格会把所有<tr>元素包裹在<tbody>标签里,你当前的table.findChildren('tr')可能因为层级问题没查到目标元素。你可以调整代码,改用find_all递归查找所有层级的<tr>(或者先定位<tbody>再找行):
from bs4 import BeautifulSoup url = "D:\opus\lt-report-opus_lmes_jenkins-20180510-111740\index.html" page = open(url) soup = BeautifulSoup(page.read(), 'html.parser') table = soup.find('table', attrs={'id': 'statisticsTable'}) if table != None: print ('Found the table ' + str(table)) # 用find_all递归查找所有<tr>,不受层级限制 rows = table.find_all('tr') for row in rows: print(row) for cell in row.find_all('td'): print(cell) print(cell.text)
你也可以先打印table.prettify(),查看表格内部的HTML结构,确认<tr>是否被<tbody>包裹,这样能快速定位问题。
2. 表格是JavaScript动态生成的
如果这个表格是页面加载后通过JavaScript动态渲染出来的(比如从后端接口拉取数据后生成),那么直接用open(url)读取的静态HTML里是没有这些<tr>元素的——BeautifulSoup只能解析静态HTML内容,无法执行JavaScript。
这种情况需要用浏览器自动化工具(比如Selenium)模拟浏览器加载页面,等待JavaScript执行完成后再获取完整的HTML:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup # 本地文件需要添加file:///前缀 url = "file:///D:/opus/lt-report-opus_lmes_jenkins-20180510-111740/index.html" driver = webdriver.Chrome() # 需提前安装ChromeDriver并配置环境变量 driver.get(url) # 等待表格加载完成,最多等待10秒 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, "statisticsTable"))) # 获取渲染后的完整页面HTML html = driver.page_source soup = BeautifulSoup(html, 'html.parser') table = soup.find('table', attrs={'id': 'statisticsTable'}) if table: rows = table.find_all('tr') for row in rows: print(row) for cell in row.find_all('td'): print(cell.text) driver.quit()
3. 解析器兼容性问题
Python内置的html.parser对一些复杂HTML的解析支持有限,你可以尝试更换更强大的解析器,比如lxml或者html5lib:
首先安装解析器:
pip install lxml
然后修改BeautifulSoup的初始化代码:
soup = BeautifulSoup(page.read(), 'lxml')
内容的提问来源于stack exchange,提问作者D. Jay
相关产品推荐
相关产品推荐

