Python网页爬取问题:无法提取大学体育部网站邮箱
爬取邮箱问题排查与解决方案
问题分析
- URL读取逻辑错误:当前读取
websites.txt的方式会逐个字符读取文件内容,拆分后可能生成格式混乱的url列表,导致请求无效。 - 页面可能动态渲染:该网站的邮箱信息大概率通过JavaScript动态加载,
requests.get()仅能获取静态HTML源码,无法捕获动态生成的内容。 - 元素选择逻辑单一:仅通过
headers属性定位单个元素,既没考虑页面存在多个邮箱的情况,也容易因页面结构细微变动失效。
修正步骤
1. 修复URL读取代码
替换为正确的逐行读取方式,过滤空行并确保url格式有效:
with open('websites.txt', 'r') as f: urls = [line.strip() for line in f if line.strip()]
2. 验证页面加载方式
先打印响应的HTML源码,检查是否包含邮箱内容:
res = requests.get(url) print(res.text) # 在输出中搜索@xxx.com格式的邮箱字符串
如果输出里找不到邮箱,说明内容是动态生成的,改用Selenium模拟浏览器加载页面:
from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome() # 需提前安装ChromeDriver并配置环境变量 for url in urls: driver.get(url) soup = BeautifulSoup(driver.page_source, 'html.parser') email_tds = soup.find_all('td', headers="col-staff_email category-0") for td in email_tds: if td.a: print(td.a.get_text(strip=True)) driver.quit()
3. 优化静态页面的元素选择
如果页面是静态渲染的,调整选择逻辑遍历所有邮箱元素:
for url in urls: res = requests.get(url) soup = BeautifulSoup(res.text, 'html.parser') try: email_tds = soup.find_all('td', headers="col-staff_email category-0") for td in email_tds: if td.a: print(td.a.text.strip()) except Exception as e: print(f"This url didn't work: {url}")
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

