我正在尝试抓取每个项目的额外页面以获取一些位置信息。
在返回之前的项目结束时,我检查是否需要抓取额外的页面以获取信息,实质上这些页面包含一些位置详细信息并且是一个简单的获取请求。
即。 http://site.com.au/MVC/Offer/GetLocationDetails/?locationId=3761&companyId=206
上面的链接要么返回一个包含更多页面要进行爬网的选项,要么返回带有地址详细信息的dd / dt。无论哪种方式,我需要提取此地址信息并将其附加到我的项目['locations']
到目前为止,我(在解析块结束时)
return self.fetchLocations(locations_selector, company_id, item)
locations_selector包含locationIds列表
然后我
def fetchLocations(self, locations, company_id, item): #response):
for location in locations:
if len(location)>1:
yield Request("http://site.com.au/MVC/Offer/GetLocationDetails/?locationId="+location+"&companyId="+company_id,
callback=self.parseLocation,
meta={'company_id': company_id, 'item': item})
最后
def parseLocation(self,response):
hxs = HtmlXPathSelector(response)
item = response.meta['item']
dl = hxs.select("//dl")
if len(dl)>0:
address = hxs.select("//dl[1]/dd").extract()
loc = {'address':remove_entities(replace_escape_chars(replace_tags(address[0], token=' '), replace_by=''))}
yield loc
locations_select = hxs.select("//select/option/@value").extract()
if len(locations_select)>0:
yield self.fetchLocations(locations_select, response.meta['company_id'], item)
似乎无法让这个工作....
答案 0 :(得分:2)
这是你的代码:
def parseLocation(self,response):
hxs = HtmlXPathSelector(response)
item = response.meta['item']
dl = hxs.select("//dl")
if len(dl)>0:
address = hxs.select("//dl[1]/dd").extract()
loc = {'address':remove_entities(replace_escape_chars(replace_tags(address[0], token=' '), replace_by=''))}
yield loc
locations_select = hxs.select("//select/option/@value").extract()
if len(locations_select)>0:
yield self.fetchLocations(locations_select, response.meta['company_id'], item)
回调必须返回对其他页面或项目的请求。在上面的代码中是查看请求,但不是项目。您有yield loc
,但loc
是dict
而非Item
子类。