Проблема здесь в том, что данные, которые вы хотите собрать, загружаются через JavaScript, и вы берете источник страницы, когда она возвращается с сервера, до того, как любой JS будет выполнен. Проблема может быть немного тонкой, так как это связано с перекрытием использования Selenium и BeautifulSoup, поэтому я буду go немного глубже ...
driver.get("https://itcostsnothing.com")
content = driver.page_source
soup = BeautifulSoup(content)
Сначала вы сообщаете Selenium go странице вы хотите данные из. Затем сразу после того, как вы возьмете источник страницы в то время. Здесь у него не было возможности заполнить данные, загруженные JS. Затем он запрашивается с помощью BeautifulSoup. Нам нужно дождаться появления элементов, которые вы хотите создать, поэтому решение становится немного более проблематичным: c.
Обычно, если вы использовали Selenium для запроса DOM, вы бы имели явное ожидание там, чтобы проверить наличие элементов, прежде чем получать от них данные. Я попробовал это, а затем взял исходный код, но либо я все еще хватаю его слишком рано, либо есть несколько слоев страницы, на которых формируются данные. В идеале вам следует отказаться от использования BeautifulSoup и выполнять все запросы в Selenium. Тем не менее, хакерский сон отлично работает и здесь, если это поможет вам:)
Вы все равно захотите настроить свой код, чтобы выбрать и распечатать элементы, чтобы захватить их все, но теперь это должно быть возможно :)
Мой последний код выглядит так ...
from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
import time
driver = webdriver.Chrome("C:\Users\hp\PycharmProjects\ipa3\drivers\chromedriver.exe")
names=[] #List to store name of the product
details=[]
locations=[]
driver.get("https://itcostsnothing.com")
time.sleep(5)
content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll('div', attrs={'class':'sc-qZtCU esHJcc'}):
name=a.find('div', attrs={'class':'textStyle topItem'})
detail=a.find('div', attrs={'class':'textDetailStyle'})
location=a.find('div', attrs={'class':'textCaptionStyle'})
names.append(name.text)
details.append(detail.text)
#locations.append(location.text)
df = pd.DataFrame({'Product Name':names,'Details':details})
print(df)
df.to_csv('products.csv', index=False, encoding='utf-8')