lldbhf 2024-05-28 23:16 采纳率: 50%
浏览 1

为什么我只获取了链接的第一个数据啊

为什么我只获取了链接的第一个数据啊?怎么才能做出大致这样:前几行全为川菜,一种菜占一行。大家有什么办法吗?刚开始学,不太懂,谢谢了

img

img

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-05-28 23:16
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的两张图片中的内容,我将尝试解释您遇到的问题,并提供一些可能的解决方案。

    问题分析

    1. XPath选择器错误:在您的代码中,item['cuisines'] = iist.xpath('./a/text()').extract_first() 这一行存在一个拼写错误,iist 应该是 lists。此外,extract_first() 方法只会提取第一个匹配的元素,如果您想获取所有元素,应该使用 extract() 方法。

    2. 遍历单个元素:在 parse_detail 方法中,您似乎只提取了第一个菜谱的名称和链接。您需要遍历所有菜谱元素。

    3. 数据结构问题:您需要确保每个菜系的数据能够按行排列,这通常意味着您需要在每个菜系下收集多个菜谱的信息。

    解决方案

    1. 修复XPath选择器:首先,修复拼写错误,并使用 extract() 方法代替 extract_first()

      item['cuisines'] = list.xpath('./a/text()').extract()
      
    2. 遍历菜谱元素:在 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})
      
    3. 组织数据:确保您的数据结构能够按照菜系组织菜谱信息。您可以使用字典来存储每个菜系的名称作为键,其值为包含所有菜谱信息的列表。

    4. 理解Scrapy框架:您需要熟悉Scrapy框架中的parse方法和Request对象的使用。parse方法用于处理响应并提取数据,而Request对象用于异步请求网页。

    5. 使用XPath定位元素:您需要熟练使用XPath表达式来定位网页中的元素。XPath是一种在XML文档中查找信息的语言,它也适用于HTML文档。

    参考资料

    示例代码

    这是一个简化的示例,展示了如何修复您的代码并遍历多个菜谱:

    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,您需要根据实际情况调整代码。希望这能帮助您解决问题!

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月28日
  • 创建了问题 5月28日

悬赏问题

  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等