网页抓取(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))
原因分析
- 原始HTML中无tbody标签:很多网页的
<table>下直接写<tr>,浏览器渲染时会自动补全<tbody>,但爬取的原始源码里实际不存在该标签。 - 匹配逻辑偏差:
class_=None的写法无法精准匹配“完全没有class属性”的标签,仅能匹配class属性为空字符串的情况,不适用于无class属性的标签。 - 解析器局限性: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
相关产品推荐
相关产品推荐

