0

我在使用我的蜘蛛脚本抓取数据时遇到问题,即使在我在 scrapy shell 中测试它时类似的代码也有效。唯一的区别是在我的脚本中我拆分了选择器。

这是在 shell 中工作的选择器:

(//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()

我对为什么这不起作用的有根据的猜测是因为当我在 shell 中使用选择器时,我可以将括号放在“//”之前和“[1]”之前,这有助于选择器正常工作。但是在脚本中我不能这样做,因为我要拆分这两个组件。

关于如何解决这个问题的任何想法?

提前感谢您的帮助!

4

1 回答 1

2

首先有一个更短的写法td[position()=2]

td[2]

接下来您所说的 XPath 是什么意思:

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

td第二个位置 ( position()=2)选择同时在第一个( [1]) 位置?

更新如果您只想在第二个之后处理所有行并且需要阅读td[2]

//tr[position() > 2]/td[2]
于 2019-10-30T06:57:00.207 回答