使用meta创建HTMLResponse

时间:2018-03-14 14:21:03

标签: python python-2.7 scrapy

我正在尝试使用元数据创建一个response对象。

def parse(self,response):
    if 'some string' in response.url:
        data = json.loads(response.body_as_unicode())
        response = HtmlResponse(url=response.url, meta=response.meta, body=data['html'].encode("utf8").decode('string_escape'))

这会出错:

TypeError: __init__() got an unexpected keyword argument 'meta'

知道如何创建response对象,我仍然可以像正常请求一样调用response.meta对象吗?

修改 正如Umair所建议的那样,我测试了这个:

def parse(self,response):
    if 'some string' in response.url:
        data = json.loads(response.body_as_unicode())
        response.replace(body = data['html'].encode("utf8").decode('string_escape'))

但是,这会提供转义的HTML输出。在shell中,结果如下:

In [20]: response.replace(body = data['html'].encode("utf8").decode('string_escape'))
Out[20]: <200 https://www.some.url>

In [21]: response.xpath('//ul')
Out[21]: 
[<Selector xpath='//ul' data=u'<ul class=\'\\"results_list\\"\'>           '>,

使用HtmlResponse时我得到了这个结果:

In [17]: test = HtmlResponse(url=response.url, body=data['html'].encode("utf8").decode('string_escape'))

In [18]: test.xpath('//ul')
Out[18]: 
[<Selector xpath='//ul' data=u'<ul class="results_list">               '>,

1 个答案:

答案 0 :(得分:0)

执行此操作,保持原始response不变,并将其body替换为您想要的新版本。

response.replace(body = data['html'].encode("utf8").decode('string_escape'))