Как исправить ошибку «не могу установить строку с несоответствующими столбцами» в пандах - PullRequest
0 голосов
/ 22 апреля 2019

Я создаю веб-скребок для моего проекта. Я на самом деле отказываюсь от работы. Я могу получить все данные, которые мне нужны. Теперь у меня возникла проблема с созданием кадра данных для его сохранения в файл 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")


Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

При воспроизведении вашего кода он не извлекал location и отступ database находится не в том месте. Итак, исправим 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)

Web scrap

0 голосов
/ 22 апреля 2019

Эта проблема вызвана тем, что # столбцы не соответствуют количеству данных (хотя бы для одной строки).

Я вижу ряд проблем: Где инициализируется файл sample_df, где вы добавляете данные в «базу данных», это самые большие, которые появляются.

Я бы реструктурировал ваш код job_post, похожий на ваш список уровней строк.Я бы использовал для добавления к списку уровня таблицы, поэтому в конце каждого цикла нажимайте table.append(job_post) вместо sample_df.loc[num] = job_post

, а затем после цикла вы можете вызвать Dataframe(table, columns=columns)

примечание: убедитесь, что вы добавляете None, Null или "", когда ваш скребок не может найти данные, иначе длина строки не будет соответствовать длине столбца, что и является причиной вашей ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...