2016-06-09 3 views
0

Начну с кодом Scrapy Я пытаюсь использовать для перебора коллекции автомобилей и извлечь модель и цену:Scrapy loop - xpath selector escaping object применяется и возвращает все записи?

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 

Я ожидал, что петли через списки и вернуть цену только для разобранного единственного транспортного средства, но на самом деле он добавляет массив всех цен на странице к каждому элементу транспортного средства.

Я предполагаю, что проблема в моих селекторах xpath - это "//div[contains(@class,'price')]/text()", что-то позволяющее синтаксическому анализатору смотреть на divs вне единственного транспортного средства, которое должно обрабатываться каждый раз?

Для справки, если я делаю listings[1], он возвращает только 1 листинг, поэтому цикл должен работать.

Редактировать: Я добавил строку print vehicle.extract() выше и подтвердил, что vehicle определенно является единственным элементом (и он изменяется каждый раз, когда цикл повторяется). Каким образом селектор xpath применяется к транспортному средству, способному покинуть объект транспортного средства и вернуть все цены?

ответ

1

Я смог решить проблему с помощью руководства, here. Таким образом, xpath действительно ускользнул от итерации, потому что я забыл поставить период перед //, что означает, что он каждый раз убегал в корневой узел.

0

У меня была такая же проблема. Я проконсультировался с документом, который вы указали. Предоставляя модифицированный код здесь, чтобы он был полезен для начинающих, таких как я. Обратите внимание, что использование '.' в 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 

 Смежные вопросы

  • Нет связанных вопросов^_^