Scrapy - Разделение селекторных частей между двумя переменными - PullRequest
0 голосов
/ 30 октября 2019

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

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

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

1 Ответ

2 голосов
/ 30 октября 2019

Прежде всего, существует более короткий способ записи td[position()=2]:

td[2]

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

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

Выберите td в вторая позиция (position()=2) в позиции первая ([1]) в то же время ?

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

//tr[position() > 2]/td[2]
...