如何使用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
相关产品推荐
相关产品推荐

