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

如何使用BeautifulSoup抓取houzz页面的地址及电话号码数据

问题根因
  • 原代码使用select()方法获取元素,该方法返回的是元素列表,无法直接调用.text属性,会直接触发异常走except分支返回空值
  • CSS选择器路径错误:你定位到了电话号码前的图标<span>标签,该标签仅用于展示图标,本身不包含号码文本,实际号码存储在该图标的父元素span.hz-pro-search-result__contact-info中
  • 定义的请求头未传入requests.get()方法,极易被网站反爬策略拦截,返回无效页面内容
修改后的完整代码
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'}
# 传入headers参数模拟浏览器请求,避免被反爬拦截
r = requests.get('https://www.houzz.com/professionals/general-contractor', headers=headers) 
soup = BeautifulSoup(r.content, 'html.parser')
tra = soup.find_all('div', class_='hz-pro-search-result__info')
for pro in tra:
    address = pro.find('span', class_='hz-pro-search-result__location-info__text').text
    try:
        # 改用select_one直接获取单个元素,调整选择器定位到存储号码的父span,清除前后空白字符
        phone = pro.select_one('div.hz-pro-search-result__right-info__contact-info > span').text.strip()
    except:
        phone = ''
    print(address, phone)
核心修改说明
  • 调用requests.get()时传入headers参数,降低反爬拦截概率
  • 将select()替换为select_one()直接获取单个匹配元素,无需额外处理列表
  • 调整CSS选择器直接定位到包含号码的父级span元素,调用.text.strip()即可拿到干净的电话号码

内容的提问来源于stack exchange,提问作者GX Mentor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:27:03