如何用BeautifulSoup爬取商品URL并实现邮件内可点击链接?
解决Qefira游戏本爬取URL失败及邮件可点击链接问题
一、修复商品链接爬取失败问题
1. 排查HTML结构与选择器正确性
你遇到的NoneType错误是因为find方法未找到目标a标签,直接取['href']导致报错。先确认页面HTML结构:
- 打开目标页面右键检查元素,确认
a标签的class确实是listing-card__inner,且它的父元素是商品卡片容器(通常是div.listing-card)。 - 改用CSS选择器定位,比
find更灵活可靠:
from bs4 import BeautifulSoup import requests # 模拟浏览器请求头,避免反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } target_url = "你的Qefira游戏本分类页面URL" response = requests.get(target_url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 遍历每个商品卡片 for card in soup.find_all('div', class_='listing-card'): # 用CSS选择器定位卡片内的a标签 link_elem = card.select_one('a.listing-card__inner') if link_elem: # 处理相对路径,拼接成完整可访问的URL raw_href = link_elem['href'] listing_url = raw_href if raw_href.startswith('http') else f"https://www.qefira.com{raw_href}" else: listing_url = "N/A" # 后续价格筛选逻辑...
2. 处理JS动态加载页面
如果页面内容是通过JavaScript渲染的,requests无法获取动态生成的元素,此时改用selenium获取渲染后的页面:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器(需提前安装对应浏览器驱动) driver = webdriver.Chrome() driver.get("你的Qefira游戏本分类页面URL") # 等待商品卡片加载完成 wait = WebDriverWait(driver, 10) cards = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'listing-card'))) for card in cards: try: link_elem = card.find_element(By.CLASS_NAME, 'listing-card__inner') raw_href = link_elem.get_attribute('href') listing_url = raw_href if raw_href.startswith('http') else f"https://www.qefira.com{raw_href}" except: listing_url = "N/A" # 后续价格筛选逻辑... driver.quit()
二、实现邮件中可点击链接
邮件默认是纯文本格式,要让链接可点击,需发送HTML格式邮件,将链接封装为HTML锚点标签:
import smtplib from email.mime.text import MIMEText # 假设你已筛选出符合条件的商品列表filtered_items,每个元素包含name、price、url字段 email_html = "<h3>80000以下的游戏本推荐</h3><ul>" for item in filtered_items: email_html += f"<li>{item['name']} - 价格:{item['price']} <a href='{item['url']}' target='_blank'>查看商品详情</a></li>" email_html += "</ul>" # 构造HTML邮件 msg = MIMEText(email_html, 'html', 'utf-8') msg['Subject'] = "Qefira游戏本价格监控通知" msg['From'] = "你的发送邮箱@xxx.com" msg['To'] = "收件邮箱@xxx.com" # 发送邮件(以QQ邮箱为例,其他邮箱调整SMTP服务器与端口) with smtplib.SMTP_SSL('smtp.qq.com', 465) as server: server.login("你的发送邮箱@xxx.com", "邮箱授权码") server.send_message(msg)
关键注意点
- 爬取时必须加请求头,避免被网站识别为爬虫拦截;
- 始终先判断元素是否存在,再访问其属性,避免
NoneType报错; - 邮件发送前可先打印
email_html内容,确认链接格式正确。
内容的提问来源于stack exchange,提问作者Outdoor_Cat
相关产品推荐
相关产品推荐

