Не сохраняется таблица в нормальном виде

Рейтинг: 0Ответов: 1Опубликовано: 05.06.2023

Парсер должен брать определенные значения на странице, а потом сохранять их в dataframe. Но код не работает по двум причинам: либо из-за ошибки "ValueError: arrays must all be same length", либо при ее решение с помощью data = list(zip(titles, part_numbers, quantities)) все сохраняется в одну колонку. Не понимаю как решить и то, и то, чтобы все работало. Вот код, может кто-нибудь поможет.

url = 'https://partscatalog.deere.com/jdrc/sidebyside/equipment/74407/referrer/navigation/pgId/131928171'
driver = webdriver.Chrome()
driver.get(url)

time.sleep(10)

soup = BeautifulSoup(driver.page_source, 'html.parser')

titles = []
part_numbers = []
quantities = []

time.sleep(2)

for title_element in driver.find_elements(By.CSS_SELECTOR,'#applicationContainer > div.userInterface > div.content > div.viewContent > div.viewContentContainer > app-sidebyside > div > div > div.col-xs-12.col-sm-12.col-lg-6.col-xl-6.col-md-6.partList > div.partStoryPart.ng-scope.ng-star-inserted'):
    title = title_element.text
    titles.append(title)
    
    # находим список комплектующих для текущего товара
    components = title_element.find_element(By.CSS_SELECTOR,'#applicationContainer > div.userInterface > div.content > div.viewContent > div.viewContentContainer > app-sidebyside > div > div > div.col-xs-12.col-sm-12.col-lg-6.col-xl-6.col-md-6.partList > div.partStoryPart.ng-scope.ng-star-inserted > div:nth-child(2)')
    
    for component in components.find_elements(By.CLASS_NAME,'row partresultsection widthLimit ng-star-inserted'):
        part_number = component.find_element(By.CSS_SELECTOR,'#applicationContainer > div.userInterface > div.content > div.viewContent > div.viewContentContainer > app-sidebyside > div > div > div.col-xs-12.col-sm-12.col-lg-6.col-xl-6.col-md-6.partList > div.partStoryPart.ng-scope.ng-star-inserted > div:nth-child(2) > div > div.col-lg-6.col-sm-6.col-md-6.col-xl-6.col-xs-6.col-tn-12.left-section > div > div > div:nth-child(1) > div.col-xl-5.col-lg-5.col-xs-5.col-sm-5.col-md-4.text-muted.partNo').text
        quantity = component.find_element(By.CSS_SELECTOR,'#applicationContainer > div.userInterface > div.content > div.viewContent > div.viewContentContainer > app-sidebyside > div > div > div.col-xs-12.col-sm-12.col-lg-6.col-xl-6.col-md-6.partList > div.partStoryPart.ng-scope.ng-star-inserted > div:nth-child(2) > div > div.col-lg-6.col-sm-6.col-md-6.col-xl-6.col-xs-6.col-tn-12.left-section > div > div > div:nth-child(1) > div.col-xl-5.col-lg-5.col-xs-5.col-sm-5.col-md-4.text-muted.partNo').text
        part_numbers.append(part_number)
        quantities.append(quantity)

# создание списка кортежей
data = {'Title': titles, 'Part Number': part_numbers, 'Quantity': quantities}

# создание DataFrame
df = pd.DataFrame(data)
df.to_excel('parts.xlsx', index=False)

Ответы

▲ 0Принят

Если выдаётся сообщение

"ValueError: arrays must all be same length"

То это означает, что в операторе создания фрейма данных:

df = pd.DataFrame(data)

Используются кортежи разной длины. Надо это проверить простейшим способом:

print(len(titles))
print(len(part_numbers))
print(len(quantities))

А вот почему эти массивы оказались разной длины - это уже разбираться Вам.

И ещё одно замечание. Зачем этот оператор:

soup = BeautifulSoup(driver.page_source, 'html.parser')

ведь Вы используете Selenium! И в тексте программы soup больше нигде не встречается.