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

如何用Beautiful Soup选择带data-start属性的div并提取定价信息?

问题解决:定位带data-start属性的元素及爬取定价信息

1. 定位带有data-start属性的<div class="row">元素

要匹配同时拥有class="row"和data-start属性的div元素,BeautifulSoup提供两种简洁实现方式:

  • 方法1:使用attrs参数
    直接指定元素标签、class属性,同时通过attrs字典匹配data-start属性(不管属性值是什么):

    price_table = soup.find("div", class_="row", attrs={"data-start": True})
    

    若知道data-start的具体值,可直接写入值,比如attrs={"data-start": "target_value"}。

  • 方法2:使用CSS选择器
    用CSS选择器语法更直观,div.row[data-start]表示选择拥有row类且带有data-start属性的div元素:

    price_table = soup.select_one("div.row[data-start]")
    

    (select_one返回第一个匹配元素,select返回所有匹配元素的列表)

2. 修复代码中的其他错误

你的代码存在几处逻辑问题,导致输出异常或报错,以下是修正后的完整代码:

from bs4 import BeautifulSoup
import requests
import json
import csv  # 替换numpy的savetxt,更适合结构化数据保存

urls = [
    'https://filterbuy.com/brand/trion-air-bear-air-filters/20x20x5-air-bear-20x20/?selected_merv=8',
    'https://filterbuy.com/brand/trion-air-bear-air-filters/20x20x5-air-bear-20x20/?selected_merv=11',
    'https://filterbuy.com/brand/trion-air-bear-air-filters/20x20x5-air-bear-20x20/?selected_merv=13'
]

# 提前打开CSV文件,准备写入
with open('products.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['product_name', 'merv_rating', 'price', 'json_data']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()

    for url in urls:
        response = requests.get(url)
        soup = BeautifulSoup(response.content, "html.parser")

        # 提取产品名称
        product = soup.find("h1", class_="text-center")
        product_name = product.get_text(strip=True) if product else "Unknown Product"

        # 提取MERV等级:从URL中截取selected_merv的值
        merv_rating = url.split('selected_merv=')[-1]

        # 定位带data-start属性的row元素,提取定价(需根据实际HTML调整子标签)
        price_table = soup.select_one("div.row[data-start]")
        # 假设定价在price_table内的span.price标签,可根据页面实际结构修改
        price = price_table.find("span", class_="price").get_text(strip=True) if price_table else "No Price"

        # 提取JSON-LD数据,增加索引判断避免报错
        json_schemas = soup.find_all('script', attrs={'type': 'application/ld+json'})
        json_file = {}
        if len(json_schemas) >= 2:
            json_file = json.loads(json_schemas[1].get_text())

        # 打印信息
        print(f"产品名称: {product_name}, MERV等级: {merv_rating}, 价格: {price}")

        # 写入CSV
        writer.writerow({
            'product_name': product_name,
            'merv_rating': merv_rating,
            'price': price,
            'json_data': json.dumps(json_file)  # 将JSON转为字符串保存
        })

关键修正点说明

  • MERV等级提取:原代码url.rsplit('?', 0)无法正确截取参数,改用split('selected_merv=')[-1]直接获取等级数字。
  • 循环逻辑:原代码中product是单个h1元素,无需zip循环,直接提取文本即可。
  • CSV保存:替换numpy.savetxt为csv模块,更适合处理字符串和结构化数据,避免格式错误。
  • 异常处理:增加元素存在性判断(比如if product else ...),避免因元素不存在导致报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:43:26