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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:45:01