You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页抓取(Scrapping)问题:无Class属性时find_all返回0结果求助

网页抓取问题:BeautifulSoup查找无Class的tbody返回0结果

问题描述

使用BeautifulSoup的find_all方法查找无Class属性的tbody标签时,始终返回0个结果。相关代码如下:

from bs4 import BeautifulSoup
import requests
from pandas.io.html import read_html

source= requests.get('https://www.ss.lv/lv/real-estate/flats/riga/all/')
soup=BeautifulSoup(source.text, "html.parser")
scrape=soup.find_all("tbody", class_=None )
print(len(scrape))

原因分析

  1. 原始HTML中无tbody标签:很多网页的<table>下直接写<tr>,浏览器渲染时会自动补全<tbody>,但爬取的原始源码里实际不存在该标签。
  2. 匹配逻辑偏差:class_=None的写法无法精准匹配“完全没有class属性”的标签,仅能匹配class属性为空字符串的情况,不适用于无class属性的标签。
  3. 解析器局限性:Python内置的html.parser对不规范HTML结构处理能力弱,可能导致标签解析丢失。

解决方案

1. 先确认原始HTML中是否存在tbody

先检查响应源码里是否真的有<tbody>:

source = requests.get('https://www.ss.lv/lv/real-estate/flats/riga/all/')
print('<tbody' in source.text)  # True表示存在,False表示不存在

若结果为False,直接跳过tbody,定位表格后获取行数据:

soup = BeautifulSoup(source.text, "lxml")
target_table = soup.find("table", class_="ads_list")
rows = target_table.find_all("tr")
print(len(rows))

2. 修正无class标签的匹配方式

若原始HTML中确实存在无class的tbody,用以下两种方式匹配:

  • 用attrs参数明确指定class属性为None:
scrape = soup.find_all("tbody", attrs={"class": None})
  • 用CSS选择器匹配“无class属性”的tbody:
scrape = soup.select("tbody:not([class])")

3. 更换解析器

推荐使用lxml或html5lib解析器,提升复杂HTML的兼容性:

# 先安装依赖:pip install lxml
soup = BeautifulSoup(source.text, "lxml")
scrape = soup.select("tbody:not([class])")
print(len(scrape))

内容的提问来源于stack exchange,提问作者Alise Valeiņa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:45:36