Python BeautifulSoup爬取网页按class查找返回None问题排查
问题根源
返回None的核心原因有两个:
- 你手动拼接的class字符串和网页解析后的实际class属性值不匹配:拼接出的
test2末尾多了4个冗余空格,类名之间的连续空格数量也和解析后的规范格式不一致。BeautifulSoup接收字符串形式的class_参数时做的是精确完整匹配,多一个空格、漏一个类名、多一个类名都匹配不到结果。 - 完全没必要硬拼完整的超长class字符串:HTML的class是多值属性,一个标签可同时绑定多个CSS类,BeautifulSoup自带更简单的多类匹配逻辑,根本不需要把上百字符的类名全写全。
修复方案
二选一即可:
方案1:用列表传入核心类名(最推荐,根本不用处理空格和长字符串)
不需要写全所有类名,只要挑几个标签固定带、辨识度高的类名放进列表就行,解析器会自动识别标签是否包含这些类,完全不用管类名之间有多少空格,也不用拆分拼接长字符串:
import requests from bs4 import BeautifulSoup html = requests.get("目标网页地址").text soup = BeautifulSoup(html, "lxml") # 该论坛的评论article标签固定带cPost、ipsComment两个核心类,传这两个就够精准匹配 comment = soup.find("article", class_=["cPost", "ipsComment"])
方案2:如果一定要用完整字符串匹配,先做空白规范化
把你拼接出来的字符串做格式处理,把连续的多个空格替换成单个空格,再删掉首尾的多余空格,保证和解析器输出的class属性格式完全一致:
import requests from bs4 import BeautifulSoup import re html = requests.get("目标网页地址").text soup = BeautifulSoup(html, "lxml") test = "cPost ipsBox ipsResponsive_pull ipsComment ipsComment_parent ipsClearfix " test2 = test + "ipsClear ipsColumns ipsColumns_noSpacing ipsColumns_collapsePhone " # 做空白规范化处理 normalized_class = re.sub(r'\s+', ' ', test2).strip() comment = soup.find("article", class_=normalized_class)
排查补充
如果按上面改完还是返回None,先打印soup.prettify()检查你拿到的响应内容里是不是真的有目标评论标签。这类论坛经常会有反爬机制,未携带正常请求头的时候可能返回登录页、验证页,页面里根本没有评论内容,再怎么写选择器都找不到结果。
内容的提问来源于stack exchange,提问作者user17540557
相关产品推荐
相关产品推荐

