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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 09:53:17