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

如何用BeautifulSoup爬取无class的特定标签并规避NoneType错误?

问题分析与解决代码

你的代码报错是因为遍历了页面中所有的<tr>标签,包括表头部分的<tr>——表头里只有<th>没有<td>,所以header.find('td')会返回None,调用.text自然会触发'NoneType' object has no attribute 'text'错误。另外你用zip(figures, names)的逻辑也有问题,names是单个<td>元素,不是列表,zip时会把它拆成字符迭代,完全不符合预期。

下面是修正后的代码,只提取目标数据:

from bs4 import BeautifulSoup
import requests

link = 'https://www.abs.gov.au/statistics/economy/price-indexes-and-inflation/residential-property-price-indexes-eight-capital-cities/latest-release'
url = requests.get(link).text
soup = BeautifulSoup(url, 'lxml')

# 定位到包含表格的div,再找到里面的table
target_div = soup.find('div', class_='abs-content clearfix text-formatted field field--name-field-abs-text-paragraph-content field--type-text-long field--label-hidden')
if target_div:
    table = target_div.find('table')
    if table:
        # 只处理tbody里的数据行,跳过表头
        data_rows = table.find('tbody').find_all('tr')
        for row in data_rows:
            # 提取地区名(第一个td)
            region_td = row.find('td')
            if region_td:
                region_name = region_td.text.strip()
                # 提取所有数值td
                value_tds = row.find_all('td', class_='text-align-right')
                values = [td.text.strip() for td in value_tds if td.text.strip()]
                # 输出结果
                print(f"地区: {region_name}")
                print(f"季度变化: {values[0] if len(values)>=1 else '无数据'}")
                print(f"年度变化: {values[1] if len(values)>=2 else '无数据'}")
                print("---")

关键改进点:

  • 直接定位到<tbody>下的行,跳过表头的<tr>,从根源避免处理无<td>的行
  • 用.strip()去除文本前后的空白字符,让数据更干净
  • 增加了多层判断(检查div、table、td是否存在),避免因页面结构变化导致的报错
  • 单独提取地区名和数值,逻辑更清晰

内容的提问来源于stack exchange,提问作者ryantl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:06:15