求助:使用Beautiful Soup无法通过属性/类定位tr标签
解决Beautiful Soup定位tr元素返回空的问题
问题原因分析
- 未精准定位目标容器:你要找的
tr元素全部嵌套在页面中id为example2的表格内,直接全局查找tr会受页面其他无关元素干扰,且内置解析器对复杂结构的解析容错性差,导致匹配失败。 - 解析器兼容性问题:Python内置的
html.parser对部分HTML结构解析不够精准,无法识别元素的属性或类名。
修正后的代码
from bs4 import BeautifulSoup import requests table_url = 'https://www.worldometers.info/world-population/population-by-country/' pop_page = requests.get(table_url).content # 改用lxml解析器(需先执行 pip install lxml 安装) table_text = BeautifulSoup(pop_page, 'lxml') # 先定位到包含目标数据的表格 target_table = table_text.find('table', id='example2') # 查找带role="row"属性的tr元素 table_rows = target_table.find_all('tr', attrs={"role": "row"}) # 查找带even类的tr元素 even_rows = target_table.find_all('tr', class_='even') print(f"带role='row'的tr数量:{len(table_rows)}") print(f"带even类的tr数量:{len(even_rows)}")
无lxml时的替代方案
如果无法安装lxml,可以使用html5lib解析器(需执行pip install html5lib),只需将解析器参数替换为:
table_text = BeautifulSoup(pop_page, 'html5lib')
关键说明
- 该页面的表格内容为静态渲染,无需处理JavaScript动态加载,
requests即可获取完整数据。 - 先定位目标表格再查找子元素,能有效缩小搜索范围,避免无关元素干扰。
内容的提问来源于stack exchange,提问作者Harper Nordin
相关产品推荐
相关产品推荐

