You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫中如何仅选取第二个指定class的元素?

解决方法

要只获取第二个c-offers-list__cont元素内的内容,你可以通过以下几种方式定位到目标元素,再在其内部查找所需的子元素:

方法1:利用列表索引

find_all方法返回匹配元素的列表,直接取索引为1的元素(列表从0开始计数):

# 定位第二个c-offers-list__cont元素
second_cont = soup.find_all('div', class_='c-offers-list__cont')[1]

方法2:使用CSS选择器

通过CSS的:nth-of-type(2)选择器直接选中第二个匹配的div:

second_cont = soup.select_one('div.c-offers-list__cont:nth-of-type(2)')

方法3:链式查找

先找到第一个目标元素,再通过find_next获取下一个同类型元素:

first_cont = soup.find('div', class_='c-offers-list__cont')
second_cont = first_cont.find_next('div', class_='c-offers-list__cont')

修改后的完整代码

将代码中直接在soup下查找元素的部分,改为在second_cont内部查找,这样就只会获取第二个div内的店铺、价格等信息:

import requests, sys
from bs4 import BeautifulSoup as bs
import pandas as pd

def program():
    try:
        arg = sys.argv[1:]
        if len(arg) == 3:
            category = arg[0]; brand = arg[1]; model = arg[2]
            url = f'https://{category}.heureka.cz/{brand}-{model}'
        else:
            print('Syntax: python program.py <kategorie> <značka> <model>')
            print('Příklad: python program.py televize samsung qe43q60b')
            sys.exit(1)
        page = requests.get(url)
        brandlist = []; valuelist = []; shipcost = []; res = {}
        if page.status_code == 200:
            try:
                soup = bs(page.content, 'html.parser')
                
                # 定位第二个c-offers-list__cont元素(这里用方法1,可替换为其他方法)
                try:
                    second_cont = soup.find_all('div', class_='c-offers-list__cont')[1]
                except IndexError:
                    print('未找到第二个目标容器元素')
                    sys.exit(1)
                
                # 仅在第二个容器内查找所需元素
                for x in second_cont.find_all('img', {'class':'c-offer__shop-logo'}):
                    brandlist.append(x['alt'].rstrip())
                for x in second_cont.find_all('span', {'class':'c-offer__price'}):
                    valuelist.append(''.join(x.contents[0].split()[:-1]))
                for x in second_cont.find_all('span', {'data-cy':'delivery-badge'}):
                    shipcost.append(x.get_text().replace('\xa0', '').replace('Kč',''))
                res = dict(zip(brandlist, valuelist))
                ship = dict(zip(brandlist, shipcost))

                minvalue_shop = min(res, key=res.get)
                maxvalue_shop = max(res, key=res.get)
                minvalue = int(min(res.items(), key=lambda x: x[1])[1])
                maxvalue = int(max(res.items(), key=lambda x: x[1])[1])

                print(f'\nPRODUKT: {category} {brand} {model}')
                print(f'Počet zapsaných hodnot: {len(res)}\n')
                
                df = pd.DataFrame(list(zip(brandlist, valuelist, shipcost)),
                    columns=['Eshop','Cena','Doprava'])
                print(df.sort_values(by=['Cena']).to_string(index=False, header=False))
                print('\nStatistiky:\n')
                print(f' Minimální cena: {minvalue} na {minvalue_shop}')
                print(f' Maximální cena: {maxvalue} na {maxvalue_shop}')
                print(f' Rozdíl cen: {maxvalue - minvalue}')
            except Exception as e:
                print(f'处理页面时出错: {e}')
                raise
    except IndexError:
        sys.exit(1)

if __name__ == '__main__':
    try:
        program()
    except TypeError:
        print('Produkt neexistuje.')
        raise
    except KeyboardInterrupt:
        sys.exit(1)

内容的提问来源于stack exchange,提问作者Samuraj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:34:54