如何正确使用BeautifulSoup库的find_all()与text()方法?爬取Divar网站低价标签遇None输出问题求助
解决BeautifulSoup提取文本返回None的问题
我一眼就看到两个关键问题导致你输出全是None,咱们一步步来修复:
1. 提取文本的方法写错了
你在循环里用的是v.txt,但BeautifulSoup里获取元素文本的正确属性是v.text(或者更灵活的v.get_text()),这是最直接的错误——因为txt根本不是BeautifulSoup元素的属性,所以返回None是必然的。
2. 元素class的匹配方式有误
你写的soup.find_all('div', attrs="kt-post-card__top-description kt-post-card-description")里,attrs参数的用法不对:直接传字符串的话,BeautifulSoup会把它当作元素的id属性值来匹配,而不是class属性。
要匹配多class的元素,正确的写法有两种:
- 使用
class_参数(因为class是Python关键字,所以加下划线):c = soup.find_all('div', class_="kt-post-card__top-description kt-post-card-description") - 或者用字典形式的
attrs:c = soup.find_all('div', attrs={'class': 'kt-post-card__top-description kt-post-card-description'})
修正后的完整代码
把这两处问题改了之后,代码就能正常提取文本了,我还加了编码处理和strip()来优化输出:
import requests from bs4 import BeautifulSoup import re url = 'https://divar.ir/s/tehran/auto' # 模拟浏览器请求,避免被反爬拦截(可选但推荐) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } test_page = requests.get(url, headers=headers) # 设置正确的编码,避免波斯语文本乱码 test_page.encoding = 'utf-8' soup = BeautifulSoup(test_page.text,'html.parser') # 正确匹配目标div元素 c = soup.find_all('div', class_="kt-post-card__top-description kt-post-card-description") for v in c: # 提取并清理文本内容 print(v.text.strip())
如果后续遇到请求被拒绝的情况,记得检查headers是否需要更新,或者考虑添加延迟请求来避免触发反爬机制。
内容的提问来源于stack exchange,提问作者Mobodev
相关产品推荐
相关产品推荐

