如何定义Scrapy字段选择?

z4iuyo4d  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(125)

请原谅我问这个问题的方式,但我们如何添加字段选项(即:Django字段选择),或者我们如何强制关键字列表(即:国家/地区列表)添加到给定字段?
我想刮数据从不同的网站束,我可以相当干净的数据,因为在一般的延伸。然而,我需要的是一种方法,迫使项目类字段接受某些值,如果该值不在列表中引发错误。
例如:
我有一个名为SourceCountry = Field()的字段,我知道我可以设置一个规则来只接受字符串值Field(serializer=str),所以现在,我至少可以避免其他数据类型的值。
现在,假设我清理了被擦除的国家/地区数据,并将其格式化为我所期望的国家/地区数据。我存储的值是“USA”,并且在我的列表中,我希望用作字段选项的值也是“USA”。太好了!我可以保存这些被擦除的数据。因此,另一方面,如果数据是“glass”,显然,它不会出现在列表中,并且Items应该会引发错误。
就我所能想象的,我可以创建一组列表,我想使用这些列表作为数据字段选择,并在将结果存储到Items中之前将其与之进行比较。
有没有更好的解决方案?更专业?
所以,我愿意接受任何建议。

  • 谢谢-谢谢
xtupzzrd

xtupzzrd1#

您可以子类化scrapy.Item类,并添加一些过滤方法来检查不需要的值。
例如:

项目.py

from scrapy import Item, Field

class QuoteItem(Item):
    text = Field()
    source = Field()
    tags = Field()

    def check_source(self, value):
        if value not in ["J.K. Rowling", "Albert Einstein", "Dr. Seuss"]:
            return self["source"] = ""
        self["source"] = value

    def check_text(self, value):
        self["text"] = value

    def check_tags(self, lst):
        if "religion" in lst:
            return self["tags"] = ""
        self["tags"] = lst

引号.py

import scrapy
from ..items import QuoteItem
class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        for quote in response.xpath('//div[@class="quote"]'):
            item = QuoteItem()
            item.check_text(quote.xpath('./span[@class="text"]/text()').get())
            item.check_source(quote.xpath('.//small[@class="author"]/text()').get())
            item.check_tags(quote.xpath('.//a[@class="tag"]/text()').getall())
            yield item
        next_page = response.xpath('//li[@class="next"]/a/@href').get()
        yield scrapy.Request(response.urljoin(next_page), callback=self.parse)

相关问题