鱼C论坛

 找回密码
 立即注册
查看: 1266|回复: 1

[已解决]python中生成器对象没有属性find

[复制链接]
发表于 2023-6-24 17:03:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. # -*- coding: utf-8 -*-

  2. import requests
  3. from pyquery import PyQuery as pq
  4. import re

  5. url = 'https://ssr1.scrape.center/'
  6. html = requests.get(url).text
  7. doc = pq(html)
  8. items = doc('.el-card').items()

  9. file = open('movie.txt','w',encoding='utf-8')
  10. for item in items:
  11.     # 电影名称
  12.     name = item.find('a > h2').text()
  13.     file.write(f'名称:{name}\n')
  14.     # 类别
  15.     categories = [item.text() for item in items.find('.categories button span').items()]
  16.     file.write(f'类别:{categories}\n')
  17.     # 上映时间
  18.     published_at = item.find('.info:contains(上映)').text()
  19.     published_at = re.search('(\d{4}-\d{2}-\d{2})',published_at). group(1) \
  20.     if published_at and re.search('\d{4}-\d{2}-\d{2}',published_at) else None
  21.     file.write(f'上映时间:{published_at}\n')
  22.     # 评分
  23.     score  =item.find('p.score').text()
  24.     file.write(f'评分:{score}\n')
  25.     file.write(f'{"=" * 50}\n')
  26.     file.close()
复制代码


运行后就报错了:
Traceback (most recent call last):
  File "E:\python\pythonProject\save_data.py", line 18, in <module>
    categories = [item.text() for item in items.find('.categories button span').items()]
AttributeError: 'generator' object has no attribute 'find'

请问怎么解决这个错误报告呢?在线等。
最佳答案
2023-6-24 17:09:29
根据提供的代码和错误信息,问题出现在 categories 的部分。根据错误提示,'generator' object has no attribute 'find',说明在 items.find('.categories button span').items() 这一行代码中,items 是一个生成器(generator)对象,并没有 find 方法。

问题的原因在于 items 是通过 doc('.el-card').items() 获取的一个生成器对象,而不是 PyQuery 对象。因此,在 items 迭代的过程中,你不能再使用 items.find() 进行查找。

解决这个问题的方法是将每个 item 转换为 PyQuery 对象,然后再使用 find() 方法进行查找。下面是修正后的代码:



  1. import requests
  2. from pyquery import PyQuery as pq
  3. import re

  4. url = 'https://ssr1.scrape.center/'
  5. html = requests.get(url).text
  6. doc = pq(html)
  7. items = doc('.el-card').items()

  8. file = open('movie.txt','w',encoding='utf-8')
  9. for item in items:
  10.     item = pq(item)  # 将item转换为PyQuery对象
  11.     # 电影名称
  12.     name = item.find('a > h2').text()
  13.     file.write(f'名称:{name}\n')
  14.     # 类别
  15.     categories = [cat.text() for cat in item.find('.categories button span').items()]
  16.     file.write(f'类别:{categories}\n')
  17.     # 上映时间
  18.     published_at = item.find('.info:contains(上映)').text()
  19.     published_at = re.search('(\d{4}-\d{2}-\d{2})',published_at).group(1) \
  20.     if published_at and re.search('\d{4}-\d{2}-\d{2}',published_at) else None
  21.     file.write(f'上映时间:{published_at}\n')
  22.     # 评分
  23.     score = item.find('p.score').text()
  24.     file.write(f'评分:{score}\n')
  25.     file.write(f'{"=" * 50}\n')

  26. file.close()
复制代码

在修正后的代码中,我添加了 item = pq(item) 这一行,将每个 item 转换为 PyQuery 对象。然后,可以使用 item.find() 方法查找对应的元素。

请尝试使用修正后的代码,并确保已经安装了 requests 和 pyquery 库。如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-6-24 17:09:29 | 显示全部楼层    本楼为最佳答案   
根据提供的代码和错误信息,问题出现在 categories 的部分。根据错误提示,'generator' object has no attribute 'find',说明在 items.find('.categories button span').items() 这一行代码中,items 是一个生成器(generator)对象,并没有 find 方法。

问题的原因在于 items 是通过 doc('.el-card').items() 获取的一个生成器对象,而不是 PyQuery 对象。因此,在 items 迭代的过程中,你不能再使用 items.find() 进行查找。

解决这个问题的方法是将每个 item 转换为 PyQuery 对象,然后再使用 find() 方法进行查找。下面是修正后的代码:



  1. import requests
  2. from pyquery import PyQuery as pq
  3. import re

  4. url = 'https://ssr1.scrape.center/'
  5. html = requests.get(url).text
  6. doc = pq(html)
  7. items = doc('.el-card').items()

  8. file = open('movie.txt','w',encoding='utf-8')
  9. for item in items:
  10.     item = pq(item)  # 将item转换为PyQuery对象
  11.     # 电影名称
  12.     name = item.find('a > h2').text()
  13.     file.write(f'名称:{name}\n')
  14.     # 类别
  15.     categories = [cat.text() for cat in item.find('.categories button span').items()]
  16.     file.write(f'类别:{categories}\n')
  17.     # 上映时间
  18.     published_at = item.find('.info:contains(上映)').text()
  19.     published_at = re.search('(\d{4}-\d{2}-\d{2})',published_at).group(1) \
  20.     if published_at and re.search('\d{4}-\d{2}-\d{2}',published_at) else None
  21.     file.write(f'上映时间:{published_at}\n')
  22.     # 评分
  23.     score = item.find('p.score').text()
  24.     file.write(f'评分:{score}\n')
  25.     file.write(f'{"=" * 50}\n')

  26. file.close()
复制代码

在修正后的代码中,我添加了 item = pq(item) 这一行,将每个 item 转换为 PyQuery 对象。然后,可以使用 item.find() 方法查找对应的元素。

请尝试使用修正后的代码,并确保已经安装了 requests 和 pyquery 库。如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表