Помимо опечатки 'space' и отступа, вы фактически не использовали info
в цикле for. Это просто продолжит печатать первый элемент. Используйте info
в цикле for, где у вас было soup
.
from bs4 import BeautifulSoup
import requests
import csv
source = requests.get('https://www.newegg.com/PS4-Systems/SubCategory/ID-3102').text
soup = BeautifulSoup(source, 'lxml')
for info in soup.find_all('div', class_='item-container'):
prod = info.find('a', class_='item-title').text.strip()
price = info.find('li', class_='price-current').text.strip().splitlines()[1].replace(u'\xa0', '')
if u'$' not in price:
price = info.find('li', class_='price-current').text.strip().splitlines()[0].replace(u'\xa0', '')
ship = info.find('li', class_='price-ship').text.strip()
print(prod)
print(price)
print(ship)
Поскольку ваш код не использует info
в приведенном ниже коде for info in soup.....:
, а soup.find(..)
, он просто продолжит искать первое вхождение, например, soup.find('a', class_='item-title')
. Если вы используете info.find(....)
, он будет использовать следующий элемент <div>
в каждом цикле цикла for.
Edit:
Я также обнаружил, что цена не всегда является вторым предметом, когда вы используете .splitlines()
, иногда это первый. Для этого я добавил проверку, чтобы увидеть, содержит ли элемент знак «$». Если нет, он использовал первый элемент списка.