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

如何让字典各键值长度一致?解决爬虫转DataFrame错位问题

解决公寓爬取数据错位问题的方案

核心思路是为每条广告先初始化所有字段的默认值(None),再填充实际获取到的数据,确保每个字段的列表长度完全一致,避免DataFrame转换时错位。

具体修改步骤

  1. 提前定义所有需要爬取的字段列表(包含你提到的100+个键)
  2. 初始化字典时为每个字段创建空列表
  3. 每条广告先生成一个含所有字段、默认值为None的临时字典
  4. 将当前广告能获取到的字段值更新到临时字典
  5. 把临时字典的所有值依次追加到总字典对应的列表中

修改后的完整代码

import pandas as pd
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from time import sleep
from bs4 import BeautifulSoup

# 1. 定义所有需要爬取的字段(补充你的100+个键)
REQUIRED_FIELDS = [
    'URL', 'price', 'location', 'zip code', 'number of floors',
    # 在这里添加其他所有需要的字段
]

# 2. 初始化总字典:每个字段对应一个空列表
all_data = {field: [] for field in REQUIRED_FIELDS}

counter = 1
url_list = []  # 这里替换成你的实际URL列表

# 优化:把driver初始化放到循环外,避免重复启动浏览器
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.maximize_window()

reversed_url_list = url_list[::-1]
for url_in_list in reversed_url_list:
    # 3. 初始化当前广告的临时字典,所有字段默认None
    temp_data = {field: None for field in REQUIRED_FIELDS}
    # 先填充URL字段
    temp_data['URL'] = url_in_list

    driver.get(url_in_list)
    sleep(3)
    html_source = driver.page_source
    soup = BeautifulSoup(html_source, 'html.parser')

    inactive_listing = soup.find(class_="listing-inactive")
    if inactive_listing:
        print(f'Skipping {url_in_list} due to inactivity.')
    else:
        try:
            # 4. 解析当前广告的字段,更新临时字典
            for row in soup.find_all('div', class_='info-table__row'):
                key_element = row.find('dt', class_='info-table__title')
                value_element = row.find('dd', class_='info-table__value')
                if key_element and value_element:  # 避免空元素报错
                    key = key_element.get_text(strip=True)
                    value = value_element.get_text(strip=True)
                    # 只更新我们需要的字段,避免无关字段混入
                    if key in REQUIRED_FIELDS:
                        temp_data[key] = value
        except Exception as e:
            print(f'Error parsing {url_in_list}: {str(e)}')

    # 5. 将临时字典的值追加到总字典对应的列表中
    for field in REQUIRED_FIELDS:
        all_data[field].append(temp_data[field])

    print(f'{str(counter)} data has been scrapped. {str(len(url_list) - counter)} remaining.')
    counter +=1

driver.quit()

# 转换为DataFrame,此时所有字段长度一致,不会错位
df = pd.DataFrame(all_data)

关键优化点说明

  • 字段统一初始化:通过REQUIRED_FIELDS确保所有需要的字段都被纳入,每条广告无论是否包含该字段,都会在总字典中追加对应的值(存在则为实际值,不存在则为None)
  • 浏览器复用:将driver初始化移到循环外,避免每次爬取都重新启动Chrome,大幅提升爬取效率
  • 空值处理:添加if key_element and value_element判断,避免因页面元素缺失导致的AttributeError
  • 字段过滤:只更新REQUIRED_FIELDS内的字段,防止页面上的无关字段混入总字典

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:50:58