Scrapy — разделение частей селектора между двумя переменными

У меня возникают проблемы с очисткой данных с помощью скрипта паука, хотя аналогичный код работает, когда я тестирую его в оболочке scrapy. Единственная разница в том, что в моем скрипте я разделяю селектор.

Вот селектор, который работает в оболочке:

(//tr[position()>2]/td[position()=2])[1]

А вот и селектор в скрипте:

def parse_forsale(self, response):
        listingdata = response.xpath(".//tr[position()>2]")  # < PART 1 OF SELECTOR
        for data in listingdata:
            A = data.xpath(".//td[position()=2][1]").get() # < PART 2 OF SELECTOR
            B = data.xpath(".//td[position()=2][2]").get()
            C = data.xpath(".//td[position()=2][3]").get()
            D = data.xpath(".//td[position()=2][4]").get()
            E = data.xpath(".//td[position()=2][5]").get()
            F = data.xpath(".//td[position()=2][6]").get()
            G = data.xpath(".//td[position()=2][7]").get()
            H = data.xpath(".//td[position()=2][8]").get()

Мое обоснованное предположение, почему это не работает, заключается в том, что когда я использую селектор в оболочке, я могу поставить круглые скобки перед // и прямо перед [1], что помогает селектору работать правильно. Однако в сценарии я не могу этого сделать, потому что разделяю два компонента.

Любые идеи о том, как я могу обойти это?

Заранее благодарю за любую помощь!


person YASPLS    schedule 30.10.2019    source источник


Ответы (1)


Во-первых, есть более короткий способ записи td[position()=2]:

td[2]

Далее, что вы имели в виду под этим XPath:

.//td[position()=2][1]

Выбрать td на второй позиции (position()=2), которая находится на первой позиции ([1]) в то же время?

ОБНОВЛЕНИЕ Если вы просто хотите обработать все строки после секунды и вам нужно прочитать td[2]:

//tr[position() > 2]/td[2]
person gangabass    schedule 30.10.2019
comment
Спасибо за совет по td[2], выглядит намного чище. Что касается вашего вопроса, я думаю, вы определили проблему. Таким образом, полный селектор //tr[›2]/td[2]. То, что я пытался сделать, это сделать его циклическим, чтобы он получал A = //tr[3]/td[2], B = //tr[4] /td[2], C = //tr[5]/td[2] и т. д. Любая идея о том, как я могу изменить сценарий, чтобы он назначал каждый последующий элемент tr следующей переменной? - person YASPLS; 31.10.2019