Красивый суп с находкой всего лишь дает последний результат - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь получить все продукты со страницы, используя красивый суп. Страница имеет нумерацию страниц, и для ее решения я сделал цикл, чтобы заставить извлечение работать для всех страниц. Но когда я перехожу к следующему шагу и пытаюсь найти теги find_all (), он выдает только данные с последней страницы. Если я попытаюсь работать с одной изолированной страницей, она будет работать нормально, поэтому я рад, что проблема с получением всех html-страниц со всех страниц.

Мой код следующий:

import pandas as pd
import numpy as np
from bs4 import BeautifulSoup
import urllib3 as ur

http = ur.PoolManager()

base_url = 'https://www.kiwoko.com/tienda-de-perros-online.html'

for x in range (1,int(33)+1):
    dog_products_http = http.request('GET', base_url+'?p='+str(x))
    soup = BeautifulSoup(dog_products_http.data, 'html.parser')
    print (soup.prettify)

и те, которые он закончил:

soup.find_all('li', {'class': 'item product product-item col-xs-12 col-sm-6 col-md-4'})

Как я уже сказал, если я не использую для диапазона и получаю только одну страницу (пример: https://www.kiwoko.com/tienda-de-perros-online.html?p=10,, она работает нормально и дает мне 36 продуктов.

Я скопировал "суп" в файл слова и произвел поиск в классе, чтобы выяснить, есть ли проблема, но есть все продукты 1.153, которые я ищу.

Итак, я думаю, что суп правильный, но, поскольку я ищу «больше, чем один HTML», я не думаю, что найти все работает хорошо.

¿В чем может быть проблема?

1 Ответ

1 голос
/ 16 июня 2019

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

Я повторно использую соединение с Session для эффективности.

from bs4 import BeautifulSoup as bs
import requests, math

results = []

with requests.Session() as s:
    r = s.get('https://www.kiwoko.com/tienda-de-perros-online.html?p=1&product_list_limit=54&isAjax=1&_=1560702601779').json()
    soup = bs(r['categoryProducts'], 'lxml')
    results.append(soup.select('.product-item-details'))
    product_count = int(soup.select_one('.toolbar-number').text)  
    pages = math.ceil(product_count / 54)

    if pages > 1:
        for page in range(2, pages + 1):
            r = s.get('https://www.kiwoko.com/tienda-de-perros-online.html?p={}&product_list_limit=54&isAjax=1&_=1560702601779'.format(page)).json()
            soup = bs(r['categoryProducts'], 'lxml')
            results.append(soup.select('.product-item-details'))

results = [result for item in results for result in item]
print(len(results))
# parse out from results what you want, as this is a list of tags, or do in loop above
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...