Scrapy - 在字符串中递增数字

时间:2013-11-17 15:47:09

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

同样,我似乎有一个这样的砖墙,我希望有人能够从头顶回答它。

以下是一个示例代码:

def parse_page(self,response):
    hxs = HtmlXPathSelector(response)

    item = response.meta['item']
    item["Details_H1"] = hxs.select('//*[@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()').extract()
    return item

似乎@id中的Details_H1可能会发生变化。例如。对于页面,它可以是@id="ctl08_p_ctl17_ctl04_ctl01_ctl00_dlProps,对于下一页,它是随机的@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps

我想实现一个do until循环等价,使代码循环遍历数字,增量为1,直到XPath产生的值为非零。因此,例如,我可以设置i = 108并且每次i = i + 1直到hxs.select('//*[@id="ctl09_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()').extract()<> []

我怎样才能实现这个目标?

非常感谢您的帮助和贡献

编辑1

TNT在下面解决了修复问题。代码应为:

def parse_page(self,response):
    hxs = HtmlXPathSelector(response)

    item = response.meta['item']
    item["Details_H1"] = hxs.select('//*[contains(@id, "_p_ctl17_ctl04_ctl01_ctl00_dlProps")]/tr[1]/td[1]/text()').extract()
    return item

2 个答案:

答案 0 :(得分:1)

'自然'XPATH方式将更加概括你的xpath表达:

xp = '//*[contains(@id, "_p_ctl17_ctl04_ctl01_ctl00_dlProps")]/tr[1]/td[1]/text()'
item["Details_H1"] = hxs.select(xp).extract()
但是我在黑暗中摸索着。您的xpath表达式可能最好从//table//tbody

开始

无论如何,“做到”会很难看。

答案 1 :(得分:0)

你可以试试这个

i = 108
while True:
    item = response.meta['item']
    xpath = '//*[@id="ct%d_p_ctl17_ctl04_ctl01_ctl00_dlProps"]/tr[1]/td[1]/text()' %i
    item["Details_H1"] = hxs.select(xpath).extract()
    if not item["Details_H1"]:
        break
    i += 1
    yield item