Houzz爬虫生成pandas DataFrame报数组长度不一致错误如何解决
错误原因
你遇到的ValueError: All arrays must be of the same length报错,核心原因是5个字段对应的列表长度不匹配:
- 存储名称、地址、评论数、评分的4个列表,长度和搜索结果页的承包商数量完全一致
- 存储官网链接的
w列表长度和上述列表不一致:部分承包商详情页没有展示官网,不会往w追加内容;也可能存在部分详情页有多个符合规则的官网链接,一次性往w追加多条内容,最终导致长度不匹配。
调整方案
核心逻辑是把基础信息采集、详情页访问、官网采集绑定到同一个承包商维度处理,每条数据一一对应,找不到官网时填充空字符串占位,保证所有列表长度完全一致。
修改后代码
import requests from bs4 import BeautifulSoup import pandas as pd 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' } # 初始化存储列表 n = [] a = [] reviews_list = [] # 修改变量名避免和标准库re冲突 ra = [] w = [] 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: # 采集基础信息,加异常捕获避免元素缺失报错 try: name = pro.find('span',class_='mlm header-5 text-unbold').text.strip() except: name = '' n.append(name) try: address = pro.find('span',class_='hz-pro-search-result__location-info__text').text.strip() except: address = '' a.append(address) try: reviews = pro.find('span',class_='hz-star-rate__review-string').text.strip() except: reviews = '' reviews_list.append(reviews) try: rating = pro.find('span',class_='hz-star-rate__rating-number').text.strip() except: rating = '' ra.append(rating) # 提取当前承包商的详情页链接 product_link = '' try: for link in pro.find_all('a',href=True)[2:]: if link['href'].startswith('https://www.houzz.com/professionals/general-contractors'): product_link = link['href'] break except: pass # 访问详情页采集官网 official_web = '' if product_link: try: detail_r = requests.get(product_link, headers=headers, timeout=10) detail_soup = BeautifulSoup(detail_r.content, 'html.parser') web_tag = detail_soup.find('a',attrs={'class':'sc-62xgu6-0 jxCcwv mwxddt-0 bSdLOV hui-link trackMe'}) if web_tag: official_web = web_tag['href'].strip() except: pass w.append(official_web) # 生成DataFrame df = pd.DataFrame({'name':n,'address':a,'reviews':reviews_list,'rating':ra,'web':w}) print(df) # 可直接导出csv文件验证结果 # df.to_csv('houzz_general_contractor.csv', index=False, encoding='utf-8-sig')
主要调整点
- 所有字段采集绑定到同一个承包商循环,保证每条数据一一对应,从根源避免长度不匹配问题
- 全流程增加异常捕获,元素不存在、请求失败时填充空字符串,不会中断程序也能保证列表长度一致
- 修改了和Python标准库重名的变量
re,避免命名冲突 - 每个详情页仅取第一个匹配的官网链接,避免单页多链接导致长度错乱
内容的提问来源于stack exchange,提问作者GX Mentor
相关产品推荐
相关产品推荐

