find_all不会去下一个项目

时间:2018-03-19 15:02:14

标签: python beautifulsoup

我正在尝试抓取多个订单项。我可以让它重复刮两次,但它没有找到所有项目,只是第一项两次。

from bs4 import BeautifulSoup
import requests

source = requests.get('https://gist.githubusercontent.com/cloudjumper2000/2f2bef395811b8f25cc3a9c8e3834117/raw/54d71f17d7e2169006eb7d8963a0e176f1448efe/nemin_sample.html').text
soup = BeautifulSoup(source, 'lxml')

for products in soup.find_all('li', class_='widget'):
    itemurl = soup.find('a', class_='product')
    print(itemurl.get('href'))

    image = soup.find('img', class_='lazy-load')
    print(image.get('data-src'))

    title = soup.find('div', class_='title').text
    print(title)

    #price = soup.find('div', class_='price')
    price = soup.find(class_='product-price').find(class_="price").text
    print(price)

    countdown = soup.find(class_='product-countdown')
    print(countdown.get('data-countdown'))

    watchlist = soup.find(class_='watchlist')
    print(watchlist.get('data-itemid'))

    print()

输出:

/Item/39138113
http://example.com/39138113-thumb.jpg
                    Item listing number 1

$6.99                                    
3/9/2018 6:48:45 AM
39138113
/Item/39138113
http://example.com/39138113-thumb.jpg
                    Item listing number 1

$6.99                                    
3/9/2018 6:48:45 AM
39138113

这是我正在抓的HTML

2 个答案:

答案 0 :(得分:1)

这里:

for products in soup.find_all('li', class_='widget'):
    itemurl = soup.find('a', class_='product')

第二个soup.find调用将返回整个文档中的第一个匹配元素。要在匹配的li元素中搜索,请改为使用products.find

for products in soup.find_all('li', class_='widget'):
    itemurl = products.find('a', class_='product')

答案 1 :(得分:1)

当您编写soup.find(...)时,您将始终获得与查询匹配的HTML中的第一个元素。因为您的循环找到两个产品,所以查询重复两次。

如果我理解正确,您想要废弃每件产品的图片,价格等?在这种情况下,请在for循环中将soup.find(...)替换为products.find(...),例如:

for products in soup.find_all('li', class_='widget'):
    itemurl = products.find('a', class_='product')
    ...