gpt4 book ai didi

python - 如果 Python Scrapy 中的蜘蛛已经看到了 Item(),如何省略对 Item() 的处理

转载 作者:行者123 更新时间:2023-12-01 02:06:47 26 4
gpt4 key购买 nike

我正在尝试在蜘蛛爬行期间删除重复的business_names。但是,我仍然看到重复的business_names。

我尝试了 if x != item['business_name'] 继续解析。

我想要的是,如果business_name尚不存在,则解析它,如果不存在,则从列表中删除或跳过查询结果。

相反,下面的代码会忽略我的 if 语句;这是我到目前为止所拥有的。

class Item(scrapy.Item):
business_name = scrapy.Field()
website = scrapy.Field()
phone_number = scrapy.Field()

class QuotesSpider(scrapy.Spider):

def parse(self, response):
for business in response.css('div.info'):
item = Item()
item['business_name'] = business.css('span[itemprop="name"]::text').extract()
for x in item['business_name']:
if (x != item['business_name']):
if item['business_name']:
item['website'] = business.css('div.links a::attr(href)').extract_first()
if item['website']:
item['phone_number'] = business.css('div.phones.phone.primary::text').extract()
yield item

最佳答案

您看到此行为的原因是范围问题。您将 item['business_name'] = 设置为 .extract() 的结果,它始终是一个列表(即使只有一个成功的 css.tag。

然后代码迭代 item['business_name'] 并检查列表中的每个元素是否 =!项目['business_name']

事实证明,这永远是True

相当于执行以下操作:

numbers = [1, 2 , 3, 4]
for x in numbers:
if x != numbers:
print(x)

#output
1
2
3
4

相反,在 for 循环之外初始化一个列表,并检查值是否在该列表中。例如,效果如下:

def parse(self, response):

for business in response.css('div.info'):
seen_business_names = []
item = Item()
item['business_name'] = business.css('span[itemprop="name"]::text').extract()
for x in item['business_name']:
if (x not in seen_business_names):
if item['business_name']: # not sure why this is here unless it is possible you are extracting empty strings
item['website'] = business.css('div.links a::attr(href)').extract_first()
if item['website']:
item['phone_number'] = business.css('div.phones.phone.primary::text').extract()
seen_business_names.append(x)
yield item

我无权访问您的 html 文件,因此我不能保证上述代码能够正常工作,但是根据您在原始帖子中提供的代码,您所面临的行为是预期的。

旁注:上述解决方案中的列表只会在每次调用 parse 步骤时保留。换句话说,对于传递给 parse 的每个 start_url。如果您想确保在 Spider 类的生命周期内,对于传递给 parse 的任何页面,全局提取唯一一个 business_name,我们可以在类定义中维护一个列表并以与我们在本地进行解析相同的方式对其进行检查。考虑:

class Item(scrapy.Item):
business_name = scrapy.Field()
website = scrapy.Field()
phone_number = scrapy.Field()

class QuotesSpider(scrapy.Spider):
#new code here
def __init__(self):
self.seen_business_names = []

def parse(self, response):
for business in response.css('div.info'):
item = Item()
item['business_name'] = business.css('span[itemprop="name"]::text').extract()
for x in item['business_name']:
#new code here, call to self.seen_business_names
if (x not in self.seen_business_names):
if item['business_name']:
item['website'] = business.css('div.links a::attr(href)').extract_first()
if item['website']:
item['phone_number'] = business.css('div.phones.phone.primary::text').extract()
#new code here, call to self.seen_business_names
self.seen_business_names.append(x)
yield item

干杯!

关于python - 如果 Python Scrapy 中的蜘蛛已经看到了 Item(),如何省略对 Item() 的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com