在scrapy项目加载器上使用正则表达式

时间:2018-02-20 10:09:03

标签: python regex web-scraping scrapy

我试图弄清楚如何使用正则表达式与scrapy项目加载器。 我尝试使用split()的lambda函数,并得到以下错误。 拆分无法定义。您可以在项加载器类中看到该函数被注释掉。

我想要做的是删除日期之前的所有文字,包括" /" 日期项目。日期项目是我刚刚解析的网址

" https://www.sofascore.com/tennis/2018-02-07"

如何在scrapy项目加载器中使用正则表达式? 我可以将正则表达式传递给项目加载器,还是必须在蜘蛛处理它?<​​/ p>

spider.py

import scrapy
from scrapy_splash import SplashRequest
from scrapejs.items import SofascoreItemLoader
from scrapy import Spider

import json
from scrapy.http import Request, FormRequest

class MySpider(scrapy.Spider):
    name = "jsscraper"

    start_urls = ["https://www.sofascore.com/tennis/2018-02-07"]


    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url=url,
                            callback=self.parse,
                            endpoint='render.html',
                            args={'wait': 1.5})



    def parse(self, response):
           for row in response.css('.event-team'):
                il = SofascoreItemLoader(selector=row)
                il.add_css('winner' , '.event-team:nth-child(2)::text')
                il.add_css('loser' , '.event-team:nth-child(1)::text')
                il.add_value('date', response.url)

                yield il.load_item()

items.py

import scrapy

from scrapy.loader import ItemLoader
from scrapy.loader.processors import TakeFirst, MapCompose, Split
from operator import methodcaller
from scrapy import Spider, Request, Selector

class SofascoreItem(scrapy.Item):
    loser = scrapy.Field()
    winner = scrapy.Field()
    date = scrapy.Field()



class SofascoreItemLoader(ItemLoader):
    default_item_class = SofascoreItem
    default_input_processor = MapCompose(methodcaller('strip'))
    default_output_processor = TakeFirst()
    #review_in = MapCompose(lambda x: x.split("/" , [-1]))

2 个答案:

答案 0 :(得分:1)

{{1}}

有关详细信息,请参阅https://doc.scrapy.org/en/latest/topics/loaders.html

答案 1 :(得分:0)

以下是代码的错误。

显然你没有必须“喂”&#39;带有add_value的项目加载器,但您最终不会填充字段。

class SofascoreItemLoader(ItemLoader):
    default_item_class = SofascoreItem
    default_input_processor = MapCompose(methodcaller('strip'))
    default_output_processor = TakeFirst()
    review_in = MapCompose(lambda x: x.split("/")[-1])

您必须执行split,然后选择列表中通过拆分生成的最后一项。 split(SEPARATOR, [-1])不是你想要的。第二个参数用于选择要将字符串拆分的部分。

其次,您想将url值添加到review字段,对吗?

这不是如何在sc regex中使用ItemLoader的答案,但您在此处不需要它。您只需要正确使用split方法。