我已经取消了我想从页面的表格数据。现在我想使用管道过滤它们(仅'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']}
你删除了所有不等于字符串的东西,你的结果是一个列表。
修改extract
为extract_first
这是一个常见的错误,因此建议使用get
和getall
方法,它们更明显。
TLDR;如果你想要一个字符串,使用get
,如果你想要一个列表,使用getall
。另外,为了更好的可读性,不要再使用extract
了。