То, как вы определили селекторы, подвержено ошибкам.Кроме того, есть несколько неисправных селекторов, которые вообще не работают.Ссылка на следующую страницу также не работает.Это только идет к странице 1 и затем выходит.И, наконец, я не знаю использования next_sibling
в селекторе css, поэтому мне пришлось выковырять эту соседнюю вещь каким-то неловким образом.
class CapeWaterfrontSpider(scrapy.Spider):
name = "cape_waterfront"
start_urls = ['https://www.capewaterfrontestates.co.za/template/Properties.vm/listingtype/SALES']
def parse(self, response):
for prop in response.css('.grid-item'):
link = prop.css('.property-image a::attr(href)').get()
bedrooms = [elem.strip() for elem in prop.css(".bedrooms::text").getall()]
bedrooms = bedrooms[-2] if len(bedrooms)>=1 else None
bathrooms = [elem.strip() for elem in prop.css(".bathrooms::text").getall()]
bathrooms = bathrooms[-2] if len(bathrooms)>=1 else None
gar = [elem.strip() for elem in prop.css(".garages::text").getall()]
gar = gar[-2] if len(gar)>=1 else None
yield scrapy.Request(
link,
meta={'item': {
'agency': self.name,
'url': link,
'bedrooms': bedrooms,
'bathroom': bathrooms,
'garages': gar
}},
callback=self.get_loc,
)
next_page = response.css('.pagination-link a.next::attr(href)').get()
if next_page:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page, callback=self.parse)
def get_loc(self,response):
items = response.meta['item']
print(items)
Если вы хотите использовать более чистый подход, чтобы получитьтри элемента, я думаю, xpath
- это то, что вы хотите придерживаться:
for prop in response.css('.grid-item'):
link = prop.css('.property-image a::attr(href)').get()
bedrooms = prop.xpath("normalize-space(.//*[contains(@class,'bedrooms')]/label/following::text())").get()
bathrooms = prop.xpath("normalize-space(.//*[contains(@class,'bathrooms')]/label/following::text())").get()
gar = prop.xpath("normalize-space(.//*[contains(@class,'garages')]/label/following::text())").get()
Я выбил два или три поля для краткости, и я полагаю, вы можете управлять ими.