Веб-программа очистки для цикла ничего не возвращает - PullRequest
0 голосов
/ 05 января 2019

Я разработал эту простую программу очистки веб-страниц для очистки newegg.com. Я сделал цикл for, чтобы распечатать название продукта, цену и стоимость доставки.

Однако, когда я запускаю цикл for, он ничего не распечатывает и не выдает никакой ошибки. Прежде чем написать цикл for (закомментированные элементы), я запустил эти строки (закомментированные элементы), и он печатает детали только для одного из продуктов.

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')

#prod = soup.find('a', class_='item-title').text
#price = soup.find('li', class_='price-current').text.strip()
#ship = soup.find('li', class_='price-ship').text.strip()
#print(prod.strip())
#print(price.strip())
#print(ship)

for info in soup.find_all('div', class_='item-container  '):
    prod = soup.find('a', class_='item-title').text
    price = soup.find('li', class_='price-current').text.strip()
    ship = soup.find('li', class_='price-ship').text.strip()
    print(prod.strip())
    #price.splitlines()[3].replace('\xa0', '')
    print(price.strip())
    print(ship)

Ответы [ 3 ]

0 голосов
/ 05 января 2019

Помимо опечатки '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(), иногда это первый. Для этого я добавил проверку, чтобы увидеть, содержит ли элемент знак «$». Если нет, он использовал первый элемент списка.

0 голосов
/ 05 января 2019

Пишите меньше кода:

from bs4 import BeautifulSoup
import requests

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 '):
    print(info.find('a', class_='item-title').text)
    print(info.find('li', class_='price-current').text.strip())        
    print(info.find('li', class_='price-ship').text.strip())
0 голосов
/ 05 января 2019

@ Рик, вы ошибочно добавили дополнительный пробел в for info in soup.find_all('div', class_='item-container '): этой строке после значения атрибута проверьте код ниже, он будет работать, как вы ожидали

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 = soup.find('a', class_='item-title').text
    price = soup.find('li', class_='price-current').text.strip()
    ship = soup.find('li', class_='price-ship').text.strip()
    print(prod.strip())
    print(price.strip())
    print(ship)

надеюсь, что это решит вашу проблему ...

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