同样,我似乎有一个这样的砖墙,我希望有人能够从头顶回答它。
以下是一个示例代码:
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
答案 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