为什么我只获取了链接的第一个数据啊?怎么才能做出大致这样:前几行全为川菜,一种菜占一行。大家有什么办法吗?刚开始学,不太懂,谢谢了
为什么我只获取了链接的第一个数据啊
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 阿里嘎多学长 2024-05-28 23:16关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
根据您提供的两张图片中的内容,我将尝试解释您遇到的问题,并提供一些可能的解决方案。
问题分析
-
XPath选择器错误:在您的代码中,
item['cuisines'] = iist.xpath('./a/text()').extract_first()
这一行存在一个拼写错误,iist
应该是lists
。此外,extract_first()
方法只会提取第一个匹配的元素,如果您想获取所有元素,应该使用extract()
方法。 -
遍历单个元素:在
parse_detail
方法中,您似乎只提取了第一个菜谱的名称和链接。您需要遍历所有菜谱元素。 -
数据结构问题:您需要确保每个菜系的数据能够按行排列,这通常意味着您需要在每个菜系下收集多个菜谱的信息。
解决方案
-
修复XPath选择器:首先,修复拼写错误,并使用
extract()
方法代替extract_first()
。item['cuisines'] = list.xpath('./a/text()').extract()
-
遍历菜谱元素:在
parse_detail
方法中,您需要遍历所有的菜谱元素,并为每个菜谱创建一个字典或类似的数据结构。def parse_detail(self, response): item = response.meta['item'] recipes = response.xpath('//div[3]/ul/li') for recipe in recipes: recipe_name = recipe.xpath('.//a[contains(@class,"cookname")]/text()').extract() recipe_link = recipe.xpath('.//a/@href').extract() # 假设您有一个列表来存储每个菜系的所有菜谱信息 item['recipes'].append({'name': recipe_name, 'link': recipe_link})
-
组织数据:确保您的数据结构能够按照菜系组织菜谱信息。您可以使用字典来存储每个菜系的名称作为键,其值为包含所有菜谱信息的列表。
-
理解Scrapy框架:您需要熟悉Scrapy框架中的
parse
方法和Request
对象的使用。parse
方法用于处理响应并提取数据,而Request
对象用于异步请求网页。 -
使用XPath定位元素:您需要熟练使用XPath表达式来定位网页中的元素。XPath是一种在XML文档中查找信息的语言,它也适用于HTML文档。
参考资料
- Scrapy官方文档:Scrapy Documentation
- XPath教程:W3Schools XPath Tutorial
示例代码
这是一个简化的示例,展示了如何修复您的代码并遍历多个菜谱:
import scrapy class DouguoSpider(scrapy.Spider): name = 'douguo' allowed_domains = ['douguo.com'] start_urls = ['https://www.douguo.com/fenlei'] def parse(self, response): lists = response.xpath('/html/body/div[2]/div/div[7]/div[2]/ul/li') for list in lists: item = douguo() item['cuisines'] = list.xpath('./a/text()').extract() detail_url = 'https://www.douguo.com/' + list.xpath('./a/@href').extract()[0] yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item}) def parse_detail(self, response): item = response.meta['item'] recipes = response.xpath('//div[3]/ul/li') item['recipes'] = [] for recipe in recipes: recipe_name = recipe.xpath('.//a[contains(@class,"cookname")]/text()').extract()[0] recipe_link = recipe.xpath('.//a/@href').extract()[0] item['recipes'].append({'name': recipe_name, 'link': recipe_link}) yield item
请注意,这个示例假设
douguo
是一个定义了的item pipeline,您需要根据实际情况调整代码。希望这能帮助您解决问题!解决 无用评论 打赏 举报 编辑记录 -
悬赏问题
- ¥100 求Web版SPC控制图程序包调式
- ¥20 指导如何跑通以下两个Github代码
- ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
- ¥15 C++为什么这个代码没报错运行不出来啊
- ¥15 一道ban了很多东西的pyjail题
- ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
- ¥15 C++识别堆叠物体异常
- ¥15 微软硬件驱动认证账号申请
- ¥15 GPT写作提示指令词
- ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等