如何使用BeautifulSoup提取href中的链接 解决返回空列表问题
问题原因及修复方案
核心问题
- 代码中定义的请求头
headers没有传入requests.get()方法,请求默认携带Python requests的官方UA标识,被Redfin的反爬机制直接拦截,返回的并非正常的房源列表页面源码,因此无法匹配到类名为bottomV2的div元素,最终得到空列表。 - Redfin反爬规则较严格,仅传UA可能仍会被拦截,可补充其他常规请求头提升通过率;如果静态请求仍拿不到对应元素,说明房源数据是前端JS动态渲染生成,静态爬取无法获取,需要改用无头浏览器方案(如Selenium、Playwright)。
修正后代码
import requests from bs4 import BeautifulSoup headers ={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Referer': 'https://www.redfin.com/' } # 传入headers参数发起请求 r = requests.get('https://www.redfin.com/city/5357/WA/Edmonds', headers=headers) # 先验证请求状态码是否为200,避免被拦截返回错误页面 print(f"请求状态码:{r.status_code}") # 解析器替换为lxml,容错率更高,需提前安装:pip install lxml soup = BeautifulSoup(r.content, 'lxml') tra = soup.find_all('div', class_='bottomV2') print(f"匹配到的bottomV2节点数量:{len(tra)}") for links in tra: for link in links.find_all('a', href=True): comp = link['href'] print(comp)
额外排查提示
如果修正后还是匹配不到节点,直接打印r.text查看返回的源码内容,确认是否出现反爬验证提示、是否存在你要找的bottomV2类元素:
- 如果源码里没有对应元素,说明数据是动态加载的,必须使用模拟浏览器的方式爬取
- 如果返回的是验证页面,需要补充cookie、使用代理IP绕过反爬
内容的提问来源于stack exchange,提问作者GX Mentor
相关产品推荐
相关产品推荐

