2012-07-18 77 views
0

我的工作scrapy框架是我spider.py代码META标记未在scrapy蟒蛇工作

class Example(BaseSpider): 
    name = "example" 
    allowed_domains = {"http://www.example.com"} 


start_urls = [ 
    "http://www.example.com/servlet/av/search&SiteName=page1" 

]

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    hrefs = hxs.select('//table[@class="knxa"]/tr/td/a/@href').extract() 
    # href consists of all href tags and i am copying in to forwarding_hrefs by making them as a string 
    forwarding_hrefs = [] 
    for i in hrefs: 
     forwarding_hrefs.append(i.encode('utf-8')) 
    return Request('http://www.example.com/servlet/av/search&SiteName=page2', 
        meta={'forwarding_hrefs': response.meta['forwarding_hrefs']}, 
        callback=self.parseJob)  


def parseJob(self, response): 
    print response,">>>>>>>>>>>" 

结果:

2012-07-18 17:29:15+0530 [example] DEBUG: Crawled (200) <GET http://www.example.com/servlet/av/search&SiteName=page1> (referer: None) 
2012-07-18 17:29:15+0530 [MemorialReqionalHospital] ERROR: Spider error processing <GET http://www.example.com/servlet/av/search&SiteName=page2> 
    Traceback (most recent call last): 
     File "/usr/lib64/python2.7/site-packages/twisted/internet/base.py", line 1167, in mainLoop 
     self.runUntilCurrent() 
     File "/usr/lib64/python2.7/site-packages/twisted/internet/base.py", line 789, in runUntilCurrent 
     call.func(*call.args, **call.kw) 
     File "/usr/lib64/python2.7/site-packages/twisted/internet/defer.py", line 361, in callback 
     self._startRunCallbacks(result) 
     File "/usr/lib64/python2.7/site-packages/twisted/internet/defer.py", line 455, in _startRunCallbacks 
     self._runCallbacks() 
    --- <exception caught here> --- 
     File "/usr/lib64/python2.7/site-packages/twisted/internet/defer.py", line 542, in _runCallbacks 
     current.result = callback(current.result, *args, **kw) 
     File "/home/local/user/project/example/example/spiders/example_spider.py", line 36, in parse 
     meta={'forwarding_hrefs': response.meta['forwarding_hrefs']}, 
    exceptions.KeyError: 'forwarding_hrefs' 

什么我想要做的是我收集所有的href标签

http://www.example.com/servlet/av/search&SiteName=page1 

,并放置到forward_hrefs并在接下来的请求调用此forward_hrefs(想在未来的方法来使用这个forward_urls列表)

http://www.example.com/servlet/av/search&SiteName=page2 

我想也从第2页中添加HREF标记forward_urls和循环在这个forward_hrefs并产生每个href标签的请求,这是我的想法,但它显示了上面的错误,上面的代码有什么错误,实际上meta标签是为了复制项目。 任何人都可以请让我知道这个如何从parse方法复制forward_hrefs列表parseJob方法。

最后,我的意思是将forward_hrefs列表从parse方法复制到parseJob方法。

希望我事先说明好后悔,如果不是请让我知道....

感谢

回答

1

没有尝试过任何东西,但似乎你这里有一个错误:

return Request('http://www.example.com/servlet/av/search&SiteName=page2', 
       meta={'forwarding_hrefs': response.meta['forwarding_hrefs']}, 
       callback=self.parseJob)  

您正在传递response.meta ['forwarding_hrefs']但它不存在此响应

您需要把:

return Request('http://www.example.com/servlet/av/search&SiteName=page2', 
       meta={'forwarding_hrefs': forwarding_hrefs}, 
       callback=self.parseJob) 

因为你有forwarding_hrefs字段,这样你就可以将它发送到meta内部的解析工作,然后在meta中你将能够访问response.meta ['forwarding_hrefs'],因为它会存在于那个响应对象中。

+0

yes确定工作,但如何访问parseJob方法中的forward_hrefs列表,因为如果我在parsejob方法中键入“print response.forward_hrefs”,它将显示错误exceptions.AttributeError:'HtmlResponse'对象没有属性'forwarding_hrefs' – 2012-07-18 12:43:44

+0

you access它像你试图在开始时传递它:response.meta ['forwarding_hrefs'] – iblazevic 2012-07-18 12:48:34

+0

哇谢谢你的工作(如果你不介意)我们也可以将项目从解析方法复制到parseJob方法,因为我们不能在单一方法中写入两个返回像返回项目返回请求(url),因为我正在实现页面我想要保存第一页的数据到项目中我想在​​下一页中使用该项目并为此项目添加第二页数据 – 2012-07-18 13:05:11