【问题标题】:Scrapy - Splitting selector parts between two variablesScrapy - 在两个变量之间拆分选择器部分
【发布时间】:2020-02-25 08:21:46
【问题描述】:

我在使用我的爬虫脚本抓取数据时遇到问题,即使我在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]”之前,这有助于选择器正常工作。但是在脚本中我不能这样做,因为我要拆分两个组件。

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

提前感谢您的帮助!

【问题讨论】:

    标签: python web-scraping scrapy screen-scraping scrapy-shell


    【解决方案1】:

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

    td[2]
    

    接下来你说这个 XPath 是什么意思:

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

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

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

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

    【讨论】:

    • 感谢 td[2] 的提示,看起来更干净了。至于你的问题,我认为你发现了问题。所以完整的选择器是“//tr[>2]/td[2]”。我试图做的是让它循环,所以它得到 A = //tr[3]/td[2], B = //tr[4] /td[2], C = //tr[5]/td[2] 等。关于如何修改脚本以便将每个后续 tr 元素分配给下一个变量的任何想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多