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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:12:53