BeautifulSoup爬取书籍链接时函数仅返回列表首元素问题求解
问题原因
代码仅返回第一个链接,由3处逻辑问题导致:
- 存储链接的
books_urls列表定义在循环内部,每次遍历新书条目时都会重置为空列表,之前存储的链接会被直接清空 return语句写在循环体内部,程序拿到第一本书的链接后就会直接终止函数运行,不会执行后续遍历- 存在冗余代码:
books_urls=list(books_urls)无实际作用,append操作后的变量本身就是列表类型,不需要重复转换
修正后可运行代码
仅使用requests+BeautifulSoup实现,可正确提取第一页所有20本书的详情页链接:
import requests from bs4 import BeautifulSoup def page1_url(page1): # 存储链接的列表必须放在循环外初始化 books_urls = [] response = requests.get(page1) # 校验请求状态,请求失败时直接抛出异常方便排查 response.raise_for_status() data = BeautifulSoup(response.text, 'html.parser') # 直接定位所有h3标签下的a标签,简化嵌套循环 for a_tag in data.select('h3 a'): relative_link = a_tag['href'] full_link = base_url + relative_link books_urls.append(full_link) # 所有链接收集完成后再返回结果 return books_urls allPages = [ 'http://books.toscrape.com/catalogue/page-1.html', 'http://books.toscrape.com/catalogue/page-2.html' ] base_url = 'http://books.toscrape.com/catalogue/' bookURLs = page1_url(allPages[0]) print(f"共提取到{len(bookURLs)}本书的链接:") print(bookURLs)
后续爬取提示
拿到所有详情页链接后,遍历bookURLs逐个发起请求,即可提取单本书的详情:
- 书籍标题:对应页面的
h1标签内容 - 库存数量:对应class为
availability的p标签内容,提取后做简单字符串处理就能拿到具体库存数字 - 价格、评分等信息也可以通过对应标签定位提取
内容的提问来源于stack exchange,提问作者Sam B
相关产品推荐
相关产品推荐

