如何用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
相关产品推荐
相关产品推荐

