使用scrapy管道过滤表格数据



我已经取消了我想从页面的表格数据。现在我想使用管道过滤它们(仅'Version'):

web数据在这里:https://learn.microsoft.com/en-us/visualstudio/install/visual-studio-build-numbers-and-release-dates?view=vs-2022

"

from scrapy.exceptions import DropItem

class ScrapytestPipeline:

def process_item(self, item, spider):
if item['Channel'] == 'Release':
return item
else:
raise DropItem("Missing specified keywords.")'''

问题是它现在什么也没返回。

蜘蛛:

import scrapy
from ..items import ScrapytestItem
class VsCodeSpider(scrapy.Spider):
name = 'vscode'
start_urls = [
'https://learn.microsoft.com/en-us/visualstudio/install/visual-studio-build-numbers-and- 
release-dates?view=vs-2022'
]
def parse(self, response):
item = ScrapytestItem()
products =  response.xpath('//table/tbody//tr')
for i in products:
item = dict()
item['Version'] = i.xpath('td[1]//text()').extract()
item['Channel'] = i.xpath('td[2]//text()').extract()
item['Releasedate'] = i.xpath('td[3]//text()').extract()
item['Buildversion'] = i.xpath('td[4]//text()').extract()
yield item

items.py文件:

import scrapy

class ScrapytestItem(scrapy.Item):
Version = scrapy.Field()
Channel = scrapy.Field()
Releasedate = scrapy.Field()
Buildversion = scrapy.Field()

我如何使用管道过滤(仅'Version'值在'Channel'字段)?谢谢!

您在代码中所做的是将所有这些内容打包到字典中并生成字典。

然而,我从你的问题中理解的是,你需要过滤版本或通道字段的值。(如果我说错了请指正)。我建议你把它们分开放。如下面的代码所示,实现预期的结果。

def parse(self, response):
item = ScrapytestItem()
products =  response.xpath('//table/tbody//tr')
for i in products:

Version = i.xpath('td[1]//text()').extract()
Channel = i.xpath('td[2]//text()').extract()
Releasedate = i.xpath('td[3]//text()').extract()
Buildversion = i.xpath('td[4]//text()').extract()
yield { "Version":Version, "Channel": Channel,"Releasedate":Releasedate, "Buildversion":Buildversion }

这样你可以使用管道过滤数据。此外,我建议查看项目加载器。它们将帮助创建更复杂的数据管道。你可以在这里阅读或观看这个视频或阅读这个博客。

问题是您使用的是extract而不是extract_first

当您使用extract时,它提取所有项并返回字符串列表。如果运行这个爬行器,您将在输出中看到[]:

{'Version': ['16.0.1'], 'Channel': ['Preview 1'], 'Releasedate': ['April 9, 2019'], 'Buildversion': ['16.0.28803.156']}

你删除了所有不等于字符串的东西,你的结果是一个列表。

修改extractextract_first

这是一个常见的错误,因此建议使用getgetall方法,它们更明显。

TLDR;如果你想要一个字符串,使用get,如果你想要一个列表,使用getall。另外,为了更好的可读性,不要再使用extract了。

相关内容

  • 没有找到相关文章

最新更新