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

如何用BeautifulSoup4获取嵌套类结构中的目标HTML元素?

爬取Target网站UPC搜索结果标题失败的解决方案

核心问题分析

你的代码存在两个关键问题导致返回空列表:

  • 选择器误用:你用class_='data-test'匹配元素,但data-test是HTML属性而非class,目标元素的data-test属性值为product-title,必须用属性选择器定位。
  • 反爬拦截风险:Target会拦截不符合浏览器特征的请求,需要完善请求头模拟真实访问。

修正后的静态爬取代码

import requests
from bs4 import BeautifulSoup as bs

# 模拟真实浏览器的请求头,可根据自身浏览器信息调整
HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
}

class targetSearch:
    def __init__(self, UPC):
        self.upc = UPC
        self.url = f"https://www.target.com/s?searchTerm={self.upc}"
        self.webpage = requests.get(self.url, headers=HEADERS)
        
        # 先验证请求是否成功
        if self.webpage.status_code != 200:
            print(f"请求失败,状态码:{self.webpage.status_code}")
            return
        
        self.soup = bs(self.webpage.content, "html.parser")
    
    def search_results(self):
        self.results = []
        # 使用属性选择器定位目标a标签
        for result in self.soup.find_all("a", attrs={"data-test": "product-title"})[:5]:
            title = result.get_text(strip=True)
            print(title)
            self.results.append(title)
        return self.results

# 调用示例(替换为目标UPC)
searcher = targetSearch("073731000100")
titles = searcher.search_results()
print("获取到的标题:", titles)

如果静态爬取仍无效(动态渲染场景)

Target部分页面内容通过JavaScript动态加载,静态请求无法获取完整HTML,此时需要用浏览器自动化工具:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time

class targetSearch:
    def __init__(self, UPC):
        self.upc = UPC
        self.url = f"https://www.target.com/s?searchTerm={self.upc}"
        
        # 配置无头Chrome,避免弹出浏览器窗口
        chrome_options = Options()
        chrome_options.add_argument("--headless=new")
        chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
        self.driver = webdriver.Chrome(options=chrome_options)
    
    def search_results(self):
        self.driver.get(self.url)
        time.sleep(3)  # 等待页面加载完成(可根据网络情况调整时长)
        
        self.results = []
        # 通过CSS选择器定位元素
        elements = self.driver.find_elements(By.CSS_SELECTOR, 'a[data-test="product-title"]')[:5]
        for elem in elements:
            title = elem.text.strip()
            print(title)
            self.results.append(title)
        
        self.driver.quit()
        return self.results

# 调用示例
searcher = targetSearch("073731000100")
print("获取到的标题:", searcher.search_results())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:20