爬取立法网站时代码抛出AttributeError:'NoneType'无startswith属性的原因
错误原因及修复方案
错误原因
- 部分
<a>标签无href属性:你遍历House Bills板块下的所有<a>标签时,有些标签是锚点(比如<a name="h_bills"></a>这类仅用于页面定位的标签),这类标签没有href属性,调用link.get('href')会返回None,直接对None调用startswith()就会触发AttributeError。 - URL拼接逻辑错误:原代码用
url + href拼接二级页面地址,但原url是带完整路径的https://www.ilga.gov/legislation/default.asp,拼接后会生成https://www.ilga.gov/legislation/default.asp/legislation/BillStatus.asp?xxx这种无效URL,导致请求失败,后续解析也会出现异常。
修复后的代码
import requests from bs4 import BeautifulSoup from urllib.parse import urljoin base_url = 'https://www.ilga.gov' url = f'{base_url}/legislation/default.asp' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 定位House Bills板块 house_bills = soup.find('a', {"name": "h_bills"}).parent # 遍历板块内所有链接 for link in house_bills.find_all('a'): href = link.get('href') # 先判断href存在,再检查路径格式 if href and href.startswith('/legislation/BillStatus.asp?'): # 用urljoin自动拼接正确的完整URL bill_url = urljoin(base_url, href) bill_response = requests.get(bill_url) bill_soup = BeautifulSoup(bill_response.content, 'html.parser') # 定位目标表格单元格,先判断是否存在 td = bill_soup.find('td', {'width': '100%'}) if td: for li in td.find_all('li'): print(li.text)
关键改动说明
- 新增
base_url存储域名,用urljoin自动处理URL拼接,避免手动拼接导致的路径错误; - 增加
href and的前置判断,确保只有带有效href属性的标签才会进入后续逻辑; - 新增
if td:的判断,防止二级页面找不到目标单元格时再次触发NoneType错误。
内容的提问来源于stack exchange,提问作者justjanga
相关产品推荐
相关产品推荐

