Scrapy中能否在XPath的tr[i]表达式中使用while循环变量i?
问题解答
该需求完全可以实现,你现有代码无法运行是存在3处明确错误,修正后即可正常执行。
核心错误说明
parse方法缩进错误,没有放在AssetSpider类内部,Scrapy无法识别该回调函数- XPath表达式中
['i']直接写死了字符串i,没有注入循环的变量值,导致所有查询都定位到错误节点 response.xpath()返回的是Selector对象,没有调用.get()方法提取实际值,存入结果的不是你需要的文本/链接内容
修正后代码
import scrapy import logging class AssetSpider(scrapy.Spider): name = 'asset' start_urls = ['http://mnregaweb4.nic.in/netnrega/asset_report_dtl.aspx?lflag=eng&state_name=WEST%20BENGAL&state_code=32&district_name=NADIA&district_code=3201&block_name=KRISHNAGAR-I&block_code=&panchayat_name=DOGACHI&panchayat_code=3201009009&fin_year=2020-2021&source=national&Digest=8+kWKUdwzDQA1IJ5qhD8Fw'] def parse(self, response): # 用for循环更简洁,也可以保留你原来的while写法 for i in range(4, 2236): assetid = response.xpath(f"//table[2]//tr[{i}]/td[2]/text()").get() assetcategory = response.xpath(f"//table[2]//tr[{i}]/td[3]/text()").get() schemecode = response.xpath(f"//table[2]//tr[{i}]/td[5]/text()").get() link = response.xpath(f"//table[2]//tr[{i}]/td[6]/a/@href").get() schemename = response.xpath(f"//table[2]//tr[{i}]/td[7]/text()").get() yield { 'assetid' : assetid, 'assetcategory' : assetcategory, 'schemecode' : schemecode, 'link' : link, 'schemename' : schemename }
优化建议
如果追求更高执行效率,可以先一次性提取所有目标tr节点再遍历,避免每次循环都全局查询DOM:
def parse(self, response): # 切片[3:]对应从第4个tr开始取,取到第2235个就停止 tr_nodes = response.xpath("//table[2]//tr")[3:2235] for tr in tr_nodes: assetid = tr.xpath("./td[2]/text()").get() assetcategory = tr.xpath("./td[3]/text()").get() schemecode = tr.xpath("./td[5]/text()").get() link = tr.xpath("./td[6]/a/@href").get() schemename = tr.xpath("./td[7]/text()").get() yield { 'assetid' : assetid, 'assetcategory' : assetcategory, 'schemecode' : schemecode, 'link' : link, 'schemename' : schemename }
内容的提问来源于stack exchange,提问作者Godz MadGOD
相关产品推荐
相关产品推荐

