首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Scrapy的"yield“中设置异常?

如何在Scrapy的"yield“中设置异常?
EN

Stack Overflow用户
提问于 2018-08-28 22:08:26
回答 2查看 212关注 0票数 1

日安,

我正在尝试使用Scrapy来抓取GitHub。它在很大程度上是有效的,但一些页面在页面本身加载完成后加载“贡献者”。当Scrapy遇到这样的页面时,它会抛出以下错误:AttributeError: 'NoneType' object has no attribute 'strip'并丢弃该URL中的所有其他内容。

有没有办法在“away”中做一个异常,这样Scrapy就可以把"None“放到结果.CSV中,而不是丢弃所有的数据?

相关代码如下:

代码语言:javascript
复制
rules = [
    Rule(LinkExtractor(allow=('Repositories'), restrict_xpaths=('//a[@rel="next"]'))),
    Rule(LinkExtractor(allow=('github'), restrict_xpaths=('//h3/a[@class="v-align-middle"]')), callback='parse_project'),
    Rule(LinkExtractor(allow=('commits/master'), restrict_xpaths=('//*[@class="commits"]/a')), follow=True, callback='parse_commits_page'),
    Rule(LinkExtractor(deny=('\+174'), restrict_xpaths=('//a[contains(text(), "Older")]')), follow=True, callback='parse_commits_page')
]

# Parse the main page of the project
def parse_project(self, response):
    yield {
        'author': response.xpath('//a[@rel="author"]/text()').extract(),
        'name': response.xpath('//strong[@itemprop="name"]/a/text()').extract(),
        'tags': [x.strip() for x in response.xpath('//a[contains(@class, "topic-tag")]/text()').extract()],
        'about': response.xpath('//*[@itemprop="about"]/text()').extract_first().strip(),
        'lang_name': response.xpath('//span[@class = "lang"]/text()').extract(),
        'lang_perc' : response.xpath('//span[@class = "percent"]/text()').extract(),
        'stars': response.xpath('//a[contains(@aria-label, "starred")]/text()').extract_first().strip(),
        'forks': response.xpath('//a[contains(@aria-label, "forked")]/text()').extract_first().strip(),
        'commits': response.xpath('//a[contains(., "commits")]/span/text()').extract_first().strip(),
        'contributors': response.xpath('//a[contains(., "contributor")]/span/text()').extract_first().strip(),
        'last_commits': None
    }

特别是,'contributors': response.xpath('//a[contains(., "contributor")]/span/text()').extract_first().strip(),是给我带来麻烦的部分,也是我想要异常的地方。

另外,我也尝试过使用"scrapy-splash“让它等待页面。

代码语言:javascript
复制
def pre_parse_project(self, response):
    yield scrapy_splash.SplashRequest(response.url, self.parse_project,
        args={
            'wait': 4,
        }
    )

但问题仍然存在,所以我至少希望获得我能获得的所有数据,并使用API填充贡献者的数量。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52059893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档