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,
}
所以我的项目似乎总是因为同样的原因而失败。我收到语法错误。我正在使用 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,
}