网页爬取时无法获取锚标签href,出现AttributeError求助
问题详情
我尝试爬取电商页面的商品分类链接,已经成功获取到目标div元素,但提取锚标签的href属性时触发了AttributeError,错误信息如下:
AttributeError Traceback (most recent call last)
Cell In[52], line 3
1 productlinks = []
2 for product in productlist:
----> 3 link = product.find("a",{"class":"category swimlane-item"}).get('href')
4 productlinks.append(baseurl + link)AttributeError: 'NoneType' object has no attribute 'get'
使用的代码如下:
%pip install beautifulsoup4 %pip install requests %pip install pandas import requests from bs4 import BeautifulSoup import pandas as pd baseurl = "https://www.goflink.com/de-DE/shop/" # baseurl = "https://www.thewhiskyexchange.com" headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'} k = requests.get('https://www.goflink.com/de-DE/shop/').text soup=BeautifulSoup(k,'html.parser') productlist = soup.find_all("div",{"class":"swimlane"}) print(productlist) productlinks = [] for product in productlist: link = product.find("a",{"class":"category swimlane-item"}).get('href') productlinks.append(baseurl + link)
问题原因与修复方案
核心问题
报错的直接原因是product.find("a",{"class":"category swimlane-item"})返回了None——也就是说,部分带有swimlane类的div里,并没有符合条件的a标签,直接调用.get('href')自然会报错。
具体修复步骤
验证元素匹配准确性
先打印每个swimlanediv的完整内容,确认里面的a标签class是否和你写的一致,避免页面结构变化或拼写错误:for product in productlist: print(product.prettify()) # 输出div的完整HTML结构,检查a标签的class添加空值判断,避免报错
在提取href前先判断是否找到a标签,只有存在时才继续处理:productlinks = [] for product in productlist: a_tag = product.find("a",{"class":"category swimlane-item"}) if a_tag: # 确认找到a标签再提取属性 link = a_tag.get('href') productlinks.append(baseurl + link)优化请求头(可选)
部分网站会根据请求头返回不同内容,更新你的User-Agent到最新版本,或者添加语言头,确保拿到正确的页面内容:headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept-Language': 'de-DE,de;q=0.9' } k = requests.get('https://www.goflink.com/de-DE/shop/', headers=headers).text用CSS选择器简化查找(可选)
使用CSS选择器写法更直观,也能避免class匹配的细节问题:productlinks = [] for product in productlist: a_tag = product.select_one('a.category.swimlane-item') if a_tag: link = a_tag.get('href') productlinks.append(baseurl + link)
内容的提问来源于stack exchange,提问作者Mohamed Hassan

