scrapy 蜘蛛代码不是 运行 因为语法?

scrapy spider code not running because of syntax?

所以我的项目似乎总是因为同样的原因而失败。我收到语法错误。我正在使用 anaconda 和 visual code studio,我认为我的环境设置正确*。

我使用的代码如下:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class BestMoviesSpider(CrawlSpider):
    name = 'best_movies'
    allowed_domains = ['imdb.com']
    start_urls = ['https://www.imdb.com/chart/top']

    rules = (
        Rule(LinkExtractor(restrict_xpaths="//td[@class='titleColumn']/a"), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
       yield {
           'title': response.xpath("//h1/text()").get(),      
            'year': response.xpath("//li[@class="ipc-inline-list__item"]/span/text()").get(),    
           'duration': response.xpath("(//li[@class="ipc-inline-list__item"])[3]/text()").get(),     
           'genre': response.xpath("//span[@class="ipc-chip__text"]/text()").get(),     
           'rating': response.xpath("//span[@class="AggregateRatingButton__RatingScore-sc-1ll29m0-1 iTLWoV"]/text()").get(),     
           'movie_url': response.url,     
       }

我得到的错误是:第 18 行 'year': response.xpath("//li[@class="ipc-inline-list__item"]/span/text()").get(), ^ 语法错误:语法无效

此外,我在 VSC 上有 2 个关于 { 和 ( 未被关闭的错误,但我认为那是因为我的代码不是 运行。

提前致谢!

问题出在 xpath 的字符串定义中。

你可以只使用单引号,你应该没问题:

# not
'year': response.xpath("//li[@class="ipc-inline-list__item"]/span/text()").get(),

# Instead use
'year': response.xpath('//li[@class="ipc-inline-list__item"]/span/text()').get(),

好像是引号的问题:

尝试替换year: response.xpath("//li[@class="ipc-inline-list__item"]/span/text()").get()

来自 year: response.xpath('//li[@class="ipc-inline-list__item"]/span/text()').get()

问题是您的 XPath 中有双引号,然后您再次使用双引号将整个 XPath 括起来。

Python 解释器和你的 VSCode linter 无法弄清楚你的字符串在哪里开始和在哪里结束。

如果您的 XPath " 使用 ' 包围整个 XPath,反之亦然。

将此更改为:

'year': response.xpath("//li[@class="ipc-inline-list__item"]/span/text()").get(),    

至:

'year': response.xpath('//li[@class="ipc-inline-list__item"]/span/text()').get(),

这是你的全部 parse_item 修正:

def parse_item(self, response):
    yield {
        'title': response.xpath("//h1/text()").get(),
        'year': response.xpath('//li[@class="ipc-inline-list__item"]/span/text()').get(),
        'duration': response.xpath('(//li[@class="ipc-inline-list__item"])[3]/text()').get(),
        'genre': response.xpath('//span[@class="ipc-chip__text"]/text()').get(),
        'rating': response.xpath('//span[@class="AggregateRatingButton__RatingScore-sc-1ll29m0-1 iTLWoV"]/text()').get(),
        'movie_url': response.url,
    }