【问题标题】:How to fix "cannot set a row with mismatched columns" error in pandas如何修复熊猫中的“无法设置列不匹配的行”错误
【发布时间】:2019-04-21 22:14:16
【问题描述】:

我正在为我的一个项目创建一个网络爬虫。我确实在网上抓取工作。我能够获得我需要的所有数据。现在我在创建数据框以将其保存到 CSV 文件时遇到问题。

我已经搜索了错误并尝试了许多可能的解决方案,但我不断收到相同的错误。感谢有关代码或错误问题的任何建议。谢谢

ValueError: cannot set a row with mismatched columns

import requests
import bs4
from bs4 import BeautifulSoup

import pandas as pd
import time


max_results_per_city = 30

city_set = ['New+York','Chicago']
columns = ["city", "job_title", "company_name", "location", "summary"]

database = pd.DataFrame(columns = columns)

for city in city_set:
    for start in range(0, max_results_per_city, 10):
        page = requests.get('https://www.indeed.com/jobs?q=computer+science&l=' + str(city) + '&start=' + str(start))
        time.sleep(1)
        soup = BeautifulSoup(page.text, "lxml")
        for div in soup.find_all(name="div", attrs={"class":"row"}):
            num = (len(sample_df) + 1)
            job_post = []
            job_post.append(city)
            for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
                job_post.append(a["title"])
            company = div.find_all(name="span", attrs={"class":"company"})
            if len(company) > 0:
                for b in company:
                    job_post.append(b.text.strip())
            else:
                sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
                for span in sec_try:
                    job_post.append(span.text)
            
            c = div.findAll('div', attrs={'class': 'location'})
            for span in c:
                 job_post.append(span.text)
            d = div.findAll('div', attrs={'class': 'summary'})
            for span in d:
                job_post.append(span.text.strip())
            database.loc[num] = job_post
            database.to_csv("test.csv")


【问题讨论】:

  • 感谢您的提问,看来您做得很好,有一些事情给您带来了麻烦。主要的是 job_post 是一个列表,每个结果的长度可以不同,而 Pandas DataFrames 和 CSV 应该有相同的列数。使用dicttuple 会更合适。

标签: python-3.x pandas dataframe beautifulsoup


【解决方案1】:

重现您的代码,它没有提取locationdatabase 缩进位置错误。所以,修复c = div.findAll(name='span', attrs={'class': 'location'}) 。这是使它工作的修复程序:

database = []

for city in city_set:
    for start in range(0, max_results_per_city, 10):
        page = requests.get('https://www.indeed.com/jobs?q=computer+science&l=' + str(city) + '&start=' + str(start))
        time.sleep(1)
        soup = BeautifulSoup(page.text, "lxml")
        for div in soup.find_all(name="div", attrs={"class":"row"}):
            #num = (len(sample_df) + 1)
            job_post = []
            job_post.append(city)
            for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
                job_post.append(a["title"])
            company = div.find_all(name="span", attrs={"class":"company"})
            if len(company) > 0:
                for b in company:
                    job_post.append(b.text.strip())
            else:
                sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
                for span in sec_try:
                    job_post.append(span.text)

            c = div.findAll(name='span', attrs={'class': 'location'})
            for span in c:
                 job_post.append(span.text)
            d = div.findAll('div', attrs={'class': 'summary'})
            for span in d:
                job_post.append(span.text.strip())
        database.append(job_post)

df00=pd.DataFrame(database)
df00.shape


df00.columns=columns
df00.to_csv("test.csv",index=False)

【讨论】:

  • 我遇到了一些工作摘要位于位置列而不是摘要列的问题。我仔细检查了这些工作是否有位置,并且它们确实有。
【解决方案2】:

此问题是由 # 列与数据量不匹配(至少为一行)引起的。

我看到了一些问题:“sample_df”在哪里初始化,你在哪里向“数据库”添加数据是弹出的大问题。

我会重组你的代码 job_post 看起来像你的行级列表。我会使用附加到表级列表,所以在每个循环结束时点击table.append(job_post) 而不是sample_df.loc[num] = job_post

然后在你的循环之后你可以打电话给Dataframe(table, columns=columns)

注意:当您的爬虫无法找到数据时,请确保您添加了 None、Null 或 "",否则您的行长将与您的列长不匹配,这就是导致您的错误的原因。强>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2021-06-17
    • 2018-08-03
    • 2019-11-23
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多