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
相关产品推荐
相关产品推荐

