Python 3.5中打印对象十六进制值而非parse方法返回值的问题排查
Scrapy parse方法打印出对象十六进制值而非返回值?
问题描述
使用Python 3.5运行Scrapy爬虫代码时,打印parse方法相关内容时,显示的是对象的十六进制内存地址,而不是parse方法的返回值,请问哪里出错了?
相关代码
class BrickSetSpider(scrapy.Spider): name = "website_spider" site_search_url = 'website.com' website_base = 'http://www.websitenew.com/search?id=site:' start_urls = [website_base + site_search_url] def parse(self, response): website_result_list = [] website_result_page = [] NEXT_PAGE_SELECTOR = 'a.sb_pagN ::attr(href)' next_page = response.css(NEXT_PAGE_SELECTOR).get() # 此处省略数据提取或分页处理逻辑 # ... return website_result_list
问题分析与解决
嘿,我来帮你捋清楚这个问题!你看到的十六进制值其实是Python对象的内存地址,出现这种情况通常有这几个原因,对应解决方法如下:
你打印的是方法对象本身,而非方法的返回结果
如果你写了类似print(BrickSetSpider.parse)或者print(spider.parse)的代码,这打印的是方法这个对象本身,自然会显示它的内存地址。你需要调用方法(加括号)并传入有效的response对象才能拿到返回值:# 先实例化爬虫对象 spider = BrickSetSpider() # 构造一个有效的response对象(示例) from scrapy.http import Response response = Response(url=spider.start_urls[0]) # 调用方法并打印返回值 print(spider.parse(response))parse方法返回的是迭代器/生成器,直接打印看不到内部内容
如果你的parse方法用了yield(Scrapy推荐的写法),返回的是生成器对象,直接打印生成器只会显示它的类型和内存地址。这时候你需要遍历生成器才能拿到里面的Item或Request:results = spider.parse(response) for item_or_request in results: print(item_or_request)想查看方法内部的处理结果,要在方法内直接打印
如果你是想确认parse方法里提取到的数据是否正确,最直接的方式是在方法内部打印数据,而不是等外部返回后再处理:def parse(self, response): website_result_list = [] # 假设这里有数据提取逻辑 for item in response.css('.result-item'): data = { 'title': item.css('h3::text').get(), 'url': item.css('a::attr(href)').get() } website_result_list.append(data) # 打印单条提取数据 print("提取到的数据:", data) # 打印全部结果列表 print("所有提取结果:", website_result_list) return website_result_list
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

