使用BeautifulSoup爬取ul嵌套li数据仅获表头报AttributeError如何解决
问题解决
错误原因
AttributeError: ResultSet object has no attribute 'find' 报错的核心原因是你对
find_all()返回的元素列表(ResultSet类型)直接调用了find()方法,只有单个元素节点才能调用find()方法。
除此之外原有代码还存在3个逻辑问题:
- 只定位到了外层
section节点,没有进入到section下嵌套的ul、li数据行层级,所以只能拿到表头内容 - 提取的是标签对象而非标签内的文本内容
- 数据存储逻辑写在循环外,只能拿到最后一次遍历的结果
修复后的代码
import requests from bs4 import BeautifulSoup import time # 存储所有爬取结果 all_info = [] # 爬取1-64页内容 for page_num in range(1, 65): url = f"https://www.expansion.com/empresas-de/ganaderia/granjas-en-general/{page_num}.html" # 加请求头避免被反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) response.encoding = response.apparent_encoding soup = BeautifulSoup(response.text, "html.parser") # 先定位到企业列表的ul节点 ul_node = soup.find("section", class_="directorio_empresas").find("ul") # 拿到ul下所有li行,跳过第一个表头行 row_list = ul_node.find_all("li")[1:] # 遍历每一行数据 for row in row_list: title = row.find('div', class_="col1").get_text(strip=True) location = row.find('div', class_="col2").get_text(strip=True) province = row.find('div', class_="col3").get_text(strip=True) all_info.append([title, location, province]) # 每页间隔1秒避免请求过快被封 time.sleep(1) # 打印结果验证 for item in all_info: print(item)
注意事项
- 代码里加了UA请求头和请求间隔,避免触发网站反爬规则
- 实际数据存储在li下的div节点内,class名和原有写法一致,直接提取文本即可
- 爬取过程中如果出现请求失败,可以适当调整sleep的间隔时间
内容的提问来源于stack exchange,提问作者Nick Gordon
相关产品推荐
相关产品推荐

