【问题标题】:using regex on scrapy item loader在scrapy项目加载器上使用正则表达式
【发布时间】:2018-07-30 15:52:08
【问题描述】:

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

我要做的是删除日期之前的所有文本,包括“/” 日期项目。日期项是我刚刚解析的 url

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

如何将正则表达式与 scrapy 项目加载器一起使用? 我可以将正则表达式传递给项目加载器还是必须在蜘蛛上处理它?

蜘蛛.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]))

【问题讨论】:

  • review_in 输入处理器必须有一个值来拆分它,对吗?我没有看到你在 parse 方法中设置它的值。

标签: python regex web-scraping scrapy


【解决方案1】:
il.add_value('date', response.url, re='([^/]+)$')

详情请见https://doc.scrapy.org/en/latest/topics/loaders.html

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
  • 这是一个非常简单的问题“如何将正则表达式与 scrapy 项目加载器一起使用?”喜欢我的回答
  • @gangabas 感谢您的简单回答。现在我了解了正则表达式如何与项目加载器一起使用。
【解决方案2】:

这是代码的问题。

显然,您不必使用add_value 'feed' 项目加载器,但最终不会填充字段。

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 字段,对吗?

这不是如何在scrapy ItemLoader 中使用regex 的答案,但你在这里不需要它。您只需要正确使用split 方法即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多