寻找全部的美丽汤只能得到最后的结果

时间:2019-06-16 16:19:11

标签: python html web-scraping beautifulsoup

我正在尝试使用漂亮的汤从页面中检索所有产品。该页面具有分页功能,为了解决该问题,我制作了一个循环以使所有页面的检索工作都可以进行。 但是,当我进行下一步并尝试“ 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'})

正如我所说,如果我不使用for范围,而只检索一页(例如:https://www.kiwoko.com/tienda-de-perros-online.html?p=10,它可以正常工作,并提供36种产品。

我已经将“汤”复制到了Word文件中,并搜索了班级以查看是否有问题,但是我正在寻找所有1.153产品。

所以,我认为汤是正确的,但是当我寻找“多个html”时,我认为发现所有的方法都行之有效。

¿可能是什么问题?

1 个答案:

答案 0 :(得分:1)

您确实希望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