使用BeautifulSoup爬取网站时如何获取同名class的全部或第二个表格?
代码调整方案
原代码仅能抓取第一个匹配元素的核心逻辑缺陷:find()是BeautifulSoup提供的单节点匹配接口,只会返回HTML文档流中第一个符合筛选条件的元素,无法命中后续同规则的节点。
场景1:输出两个匹配表格的全部内容
将原代码中的find()替换为find_all(),该接口会把所有符合筛选条件的元素,按照在HTML中的出现顺序整理成列表返回:
page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') # 替换find为find_all,拿到所有class为table3的tr元素 all_matched = soup.find_all("tr", {"class": "table3"}) # 遍历列表逐个输出内容 for pos, content in enumerate(all_matched): print(f"--- 第{pos+1}个匹配表格内容 ---") print(content.prettify())
列表的元素顺序和页面HTML的渲染顺序完全一致,第一个元素是原代码能抓到的内容,第二个就是此前被遗漏的表格信息。
场景2:仅输出第二个匹配表格的内容
拿到find_all()返回的元素列表后,通过列表索引直接定位第二个元素即可(Python列表为0起始索引,第二个元素对应索引值1):
page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') all_matched = soup.find_all("tr", {"class": "table3"}) # 增加长度判断,避免页面结构变动、匹配元素数量不足时引发的索引越界报错 if len(all_matched) >= 2: second_table = all_matched[1] print(second_table.prettify())
如果后续页面中同class的匹配元素数量增加,只要数清楚目标表格在文档中的实际出现次序,修改对应的列表索引值就能精准定位,不需要重写选择器逻辑。
内容的提问来源于stack exchange,提问作者Mo711
相关产品推荐
相关产品推荐

