Scrapy 循环 - xpath 选择器转义它所应用的对象并返回所有记录?
Scrapy loop - xpath selector escaping object it is applied to and returning all records?
我将从尝试使用 scrapy 代码开始遍历车辆集合并提取模型和价格:
def parse(self, response):
hxs = Selector(response)
split_url = response.url.split("/")
listings = hxs.xpath("//div[contains(@class,'listing-item')]")
for vehicle in listings:
item = Vehicle()
item['make'] = split_url[5]
item['price'] = vehicle.xpath("//div[contains(@class,'price')]/text()").extract()
item['description'] = vehicle.xpath("//div[contains(@class,'title-module')]/h2/a/text()").extract()
yield item
我原本希望循环遍历列表和 return 仅为正在解析的单个车辆的价格,但它实际上是将页面上所有价格的数组添加到每个车辆项目。
我假设问题出在我的 xpath 选择器中 - "//div[contains(@class,'price')]/text()"
是否以某种方式允许解析器查看每次都应该解析的单一车辆之外的 div?
作为参考,如果我这样做 listings[1]
它 return 只有 1 个列表,因此循环应该有效。
编辑:我在上面添加了 print vehicle.extract()
行,并确认 vehicle
绝对只是一个单独的项目(并且每次循环迭代时它都会改变)。应用于 vehicle 的 xpath 选择器如何能够逃脱 vehicle 对象和 return 所有价格?
我在手册的帮助下解决了这个问题,here。综上所述,xpath确实是在逃避迭代,因为我忘记在//
前面加上句号,这意味着它每次都在逃避到根节点。
我遇到了同样的问题。我已经查阅了您提到的文件。这里提供修改后的代码,希望对像我这样的初学者有所帮助。注意xpath中'.'
的用法.//div[contains(@class,'title-module')]/h2/a/text()
def parse(self, response):
hxs = Selector(response)
split_url = response.url.split("/")
listings = hxs.xpath("//div[contains(@class,'listing-item')]")
for vehicle in listings:
item = Vehicle()
item['make'] = split_url[5]
item['price'] = vehicle.xpath(".//div[contains(@class,'price')]/text()").extract()
item['description'] = vehicle.xpath(".//div[contains(@class,'title-module')]/h2/a/text()").extract()
yield item
我将从尝试使用 scrapy 代码开始遍历车辆集合并提取模型和价格:
def parse(self, response):
hxs = Selector(response)
split_url = response.url.split("/")
listings = hxs.xpath("//div[contains(@class,'listing-item')]")
for vehicle in listings:
item = Vehicle()
item['make'] = split_url[5]
item['price'] = vehicle.xpath("//div[contains(@class,'price')]/text()").extract()
item['description'] = vehicle.xpath("//div[contains(@class,'title-module')]/h2/a/text()").extract()
yield item
我原本希望循环遍历列表和 return 仅为正在解析的单个车辆的价格,但它实际上是将页面上所有价格的数组添加到每个车辆项目。
我假设问题出在我的 xpath 选择器中 - "//div[contains(@class,'price')]/text()"
是否以某种方式允许解析器查看每次都应该解析的单一车辆之外的 div?
作为参考,如果我这样做 listings[1]
它 return 只有 1 个列表,因此循环应该有效。
编辑:我在上面添加了 print vehicle.extract()
行,并确认 vehicle
绝对只是一个单独的项目(并且每次循环迭代时它都会改变)。应用于 vehicle 的 xpath 选择器如何能够逃脱 vehicle 对象和 return 所有价格?
我在手册的帮助下解决了这个问题,here。综上所述,xpath确实是在逃避迭代,因为我忘记在//
前面加上句号,这意味着它每次都在逃避到根节点。
我遇到了同样的问题。我已经查阅了您提到的文件。这里提供修改后的代码,希望对像我这样的初学者有所帮助。注意xpath中'.'
的用法.//div[contains(@class,'title-module')]/h2/a/text()
def parse(self, response):
hxs = Selector(response)
split_url = response.url.split("/")
listings = hxs.xpath("//div[contains(@class,'listing-item')]")
for vehicle in listings:
item = Vehicle()
item['make'] = split_url[5]
item['price'] = vehicle.xpath(".//div[contains(@class,'price')]/text()").extract()
item['description'] = vehicle.xpath(".//div[contains(@class,'title-module')]/h2/a/text()").extract()
yield item