Почему мой скребок не очищает нужные элементы?

Я пытаюсь спарсить артикул и описание на этом сайте: https://www.dewalt.com/products/power-tools/

но он не будет очищать нужные элементы, несмотря на то, что код может быть запущен. Кто-нибудь знает, почему? Я хватаю не те элементы?

import undetected_chromedriver as uc

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd
import time
from selenium.common.exceptions import NoSuchElementException

options = Options()
driver = uc.Chrome()

website = 'https://www.dewalt.com/products/power-tools/drills'
driver.get(website)


WebDriverWait(driver, 5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#product-list')))
prod_num = []
prod_desc = []
container = driver.find_element(By.CSS_SELECTOR, '#product-list')


for _ in range(4):
        driver.execute_script("window.scrollBy(0, 2000);")
        time.sleep(2)

skus = container.find_elements(By.CLASS_NAME, 'coh-inline-element product-sku')
descriptions = container.find_elements(By.CLASS_NAME, 'coh-link subtitle card-link product-title')

for sku in skus:
    prod_num.append(sku.text)
for desc in descriptions:
    prod_desc.append(desc.text)




driver.quit()
print(len(prod_num))
print(len(prod_desc))
# Create a DataFrame from the scraped data

df = pd.DataFrame({'code': prod_num, 'description': prod_desc})

# Save the DataFrame to a CSV file
df.to_csv('dewtest1.csv', index=False)

print(df)


Пожалуйста, используйте селектор CSS или Xpath: stackoverflow.com/questions/37771604/…

LetsScrapeData 09.07.2024 03:57
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Содержимое, которое вам нужно, является статическим, поэтому вместо этого вам следует использовать модуль запросов. Вот как этого можно добиться с помощью модуля Requests:

import requests
import pandas as pd
from bs4 import BeautifulSoup

link = 'https://www.dewalt.com/products/power-tools/drills'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
}

res = requests.get(link,headers=headers)
soup = BeautifulSoup(res.text,"html.parser")
df = pd.DataFrame(columns= ['sku','desc'])
for item in soup.select(".coh-column > article[role='article']"):
    sku = item.select_one(".product-sku").get_text(strip=True)
    desc = item.select_one(".product-title").get_text(strip=True)
    df = pd.concat([df, pd.DataFrame({'sku': [sku], 'desc': [desc]})], ignore_index=True)
    print(sku,desc)

df.to_csv("dewalt.csv",index=False)

Ваш существующий подход также должен работать, если вы учтете следующие изменения в селекторе:

product_list = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".coh-column > article[role='article']")))
prod_num = []
prod_desc = []
for container in product_list:
    sku = container.find_element(By.CSS_SELECTOR, '.product-sku').text
    description = container.find_element(By.CSS_SELECTOR, '.product-title').text
    prod_num.append(sku)
    prod_desc.append(description)

df = pd.DataFrame({'code': prod_num, 'description': prod_desc})
df.to_csv('dewtest1.csv', index=False)

не могли бы вы объяснить, что происходит в этой строке? для элемента в супе.select(".coh-column > статья[role='article']")

Ryan Houghton 10.07.2024 00:59

Селектор CSS .coh-column > article[role='article'] используется для выбора необходимых элементов на этой странице. .coh-column выбирает все элементы со столбцом класса coh. > — дочерний комбинатор. Он выбирает только прямых дочерних элементов элементов, соответствующих предыдущему селектору. article[role='article'] сопоставляет элементы статьи, имеющие роль атрибута, со значением статьи.

MITHU 10.07.2024 08:21

Другие вопросы по теме