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

