鱼C论坛

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

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

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

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

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

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

import requests
from pyquery import PyQuery as pq
import re

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

file = open('movie.txt','w',encoding='utf-8')
for item in items:
    # 电影名称
    name = item.find('a > h2').text()
    file.write(f'名称:{name}\n')
    # 类别
    categories = [item.text() for item in items.find('.categories button span').items()]
    file.write(f'类别:{categories}\n')
    # 上映时间
    published_at = item.find('.info:contains(上映)').text()
    published_at = re.search('(\d{4}-\d{2}-\d{2})',published_at). group(1) \
    if published_at and re.search('\d{4}-\d{2}-\d{2}',published_at) else None
    file.write(f'上映时间:{published_at}\n')
    # 评分
    score  =item.find('p.score').text()
    file.write(f'评分:{score}\n')
    file.write(f'{"=" * 50}\n')
    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() 方法进行查找。下面是修正后的代码:


import requests
from pyquery import PyQuery as pq
import re

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

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

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

请尝试使用修正后的代码,并确保已经安装了 requests 和 pyquery 库。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> 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() 方法进行查找。下面是修正后的代码:


import requests
from pyquery import PyQuery as pq
import re

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

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

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

请尝试使用修正后的代码,并确保已经安装了 requests 和 pyquery 库。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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