Python网页爬取问题:从<tr><td><font><strong>标签提取网站URL
NCES网站表格URL提取及TypeError问题解决
错误原因分析
你遇到的TypeError大概率是因为代码中直接对find()/find_all()返回的None对象调用了方法(比如get('href'))——当找不到目标元素时,这些方法会返回None,后续操作自然报错。另外也可能是遍历元素时类型不匹配,把非Tag对象当成Tag处理。
稳定提取方案(基于BeautifulSoup)
结合NCES网站左下角表格的常见结构(假设你提供的HTML类似如下):
Website http://www.abcusd.us
可直接复用的代码
import requests from bs4 import BeautifulSoup import time def get_school_website(page_url): try: # 发送请求,添加超时和异常捕获 resp = requests.get(page_url, timeout=15) resp.raise_for_status() soup = BeautifulSoup(resp.text, 'html.parser') # 定位包含"Website"的行:用文本匹配,兼容空格/换行 website_row = soup.find('tr', text=lambda txt: txt and 'Website' in txt.strip()) if not website_row: return None # 找到该行对应的链接单元格 link_cell = website_row.find_next('td') if not link_cell: return None # 提取a标签的href属性 link_tag = link_cell.find('a') return link_tag.get('href') if link_tag else None except Exception as err: print(f"处理页面 {page_url} 失败: {str(err)}") return None # 批量处理逻辑 # 替换成你的2115个页面URL列表 target_pages = ["http://nces-page-1.com", "http://nces-page-2.com", ...] output_data = [] for page in target_pages: site_url = get_school_website(page) output_data.append({"source_page": page, "school_website": site_url}) # 添加延迟,避免触发反爬 time.sleep(0.8) # 保存结果到CSV(方便后续查看) import csv with open('nces_school_websites.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.DictWriter(f, fieldnames=["source_page", "school_website"]) writer.writeheader() writer.writerows(output_data)
关键优化点
- 防TypeError:每一步调用
find()后都先判断是否为None,再执行后续操作,彻底避免对None对象调用方法的错误 - 批量处理适配:
- 添加请求延迟,降低被网站封禁的风险
- 异常捕获覆盖所有请求和解析环节,单个页面失败不会中断整个批量任务
- 最终结果保存为CSV,方便后续整理
- 结构兼容:如果目标表格有特定class/id,比如
soup.find('table', class_='footer-detail-table'),可以替换行定位的代码,提高定位准确性
原有错误代码修复示例
如果你的代码是类似这种错误写法:
# 错误示例:未判断元素是否存在就直接调用方法 a_tag = soup.find('tr', text='Website').find_next('td').find('a') school_url = a_tag.get('href')
修复后应该是:
# 正确写法:逐层判断元素是否存在 row = soup.find('tr', text=lambda t: t and 'Website' in t.strip()) if row: td = row.find_next('td') if td: a_tag = td.find('a') if a_tag: school_url = a_tag.get('href')
内容的提问来源于stack exchange,提问作者Krishan Pratap Singh
相关产品推荐
相关产品推荐

