BeautifulSoup项目URL拼接遇AttributeError,求问题定位及替代方案
问题分析与解决
错误定位
你碰到的AttributeError: 'tuple' object has no attribute 'append',根源在这行代码:
url_combine = root_url , source
Python里用逗号分隔两个变量,会自动打包成元组(tuple),而元组是不可变类型,压根没有append()方法。之前你已经把url_combine初始化为列表[],这行代码直接覆盖了它的类型,导致后续循环调用append()时触发报错。
修复代码
删掉这行错误代码,再调整逻辑确保拼接后的完整URL能正确存入最终的DataFrame:
方案一:获取链接时直接拼接(推荐)
拿到相对链接后立刻生成完整URL,一步到位减少后续处理:
# 删掉错误代码:url_combine = root_url , source for result in results: # ... 其他字段的获取代码保持不变 ... # link try: relative_link = result.find('a', {'class':'vehicle-card-visited-tracking-link'}).get('href') full_link = urllib.parse.urljoin(root_url, relative_link) source.append(full_link) # 直接存储完整链接 except: source.append('n/a')
后续生成DataFrame时,直接用source作为Link列即可。
方案二:先存相对链接再统一拼接
如果想保留分步处理的逻辑,确保url_combine始终是列表:
url_combine = [] root_url = 'http://www.cars.com' # 删掉错误代码:url_combine = root_url , source for result in results: # ... 其他字段不变 ... # link try: source.append(result.find('a', {'class':'vehicle-card-visited-tracking-link'}).get('href')) except: source.append('n/a') # 只处理当前页面新增的链接,避免重复拼接历史内容 for link in source[-len(results):]: url_combine.append(urllib.parse.urljoin(root_url, link))
生成DataFrame时,把Link列的值换成url_combine:
car_listings = pd.DataFrame({'Name': name, 'Mileage':mileage, 'Price': price, 'Dealer Name':dealer_name,'Link': url_combine})
获取完整URL的其他实现方式
- 直接字符串拼接:如果所有相对链接都以
/开头,可以用root_url + relative_link,但这种方式不够健壮——如果relative_link本身是完整URL或者不带/,会生成错误链接。 - 用requests封装的urljoin:和urllib的实现完全一致,只是换了个导入路径:
from requests.compat import urljoin full_link = urljoin(root_url, relative_link)
内容的提问来源于stack exchange,提问作者LouVo
相关产品推荐
相关产品推荐

