AttributeError:'Response'对象没有python的属性'body_as_unicode'scrapy

时间:2015-07-27 07:14:11

标签: python web-scraping scrapy httpresponse

我正在处理scrapy中的响应并继续收到此消息。

我只给出了发生错误的片段。我正在尝试浏览不同的网页,并且需要获取该特定网页中的#个页面。所以我创建了一个响应对象,在那里我获得了下一个按钮的href,但继续获取AttributeError: 'Response' object has no attribute 'body_as_unicode'

代码使用。

from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy.http import Request
from scrapingtest.items import ScrapingTestingItem
from collections import OrderedDict
import json
from scrapy.selector.lxmlsel import HtmlXPathSelector
import csv
import scrapy
from scrapy.http import Response

class scrapingtestspider(Spider):
    name = "scrapytesting"
    allowed_domains = ["tripadvisor.in"]
 #   base_uri = ["tripadvisor.in"]

    def start_requests(self):
        site_array=["http://www.tripadvisor.in/Hotel_Review-g3581633-d2290190-Reviews-Corbett_Treetop_Riverview-Marchula_Jim_Corbett_National_Park_Uttarakhand.html"
                    "http://www.tripadvisor.in/Hotel_Review-g297600-d8029162-Reviews-Daman_Casa_Tesoro-Daman_Daman_and_Diu.html",
                    "http://www.tripadvisor.in/Hotel_Review-g304557-d2519662-Reviews-Darjeeling_Khushalaya_Sterling_Holidays_Resort-Darjeeling_West_Bengal.html",
                    "http://www.tripadvisor.in/Hotel_Review-g319724-d3795261-Reviews-Dharamshala_The_Sanctuary_A_Sterling_Holidays_Resort-Dharamsala_Himachal_Pradesh.html",
                    "http://www.tripadvisor.in/Hotel_Review-g1544623-d8029274-Reviews-Dindi_By_The_Godavari-Nalgonda_Andhra_Pradesh.html"]

        for i in range(len(site_array)):
            response = Response(url=site_array[i])
            sites = Selector(response).xpath('//a[contains(text(), "Next")]/@href').extract()
 #           sites = response.selector.xpath('//a[contains(text(), "Next")]/@href').extract()
            for site in sites:
                yield Request(site_array[i],self.parse)

`

2 个答案:

答案 0 :(得分:5)

在这种情况下,发生错误的行要求TextResponse对象不是正常响应。尝试创建TextResponse而不是普通的Response来解决错误。

记录缺失的方法here

更具体地说,使用HtmlResponse,因为您的回复是HTML,而不是纯文本。 HtmlResponseTextResponse的子类,因此它继承了缺少的方法。

还有一件事:你在哪里设置Response的正文?没有任何正文,您的xpath查询将不会返回任何内容。就您问题中的示例而言,您只设置了URL但没有设置正文。这就是为什么xpath不返回任何内容。

答案 1 :(得分:0)

这并不能解决这个问题,但可以用来查找返回的响应对象的问题。我正在添加它作为答案,以便它可以帮助某人调试他们面临的问题。

我遇到了类似的错误:AttributeError: 'HtmlResponse' object has no attribute 'text'当我这样做时:

scrapy shell 'http://example.com'
>>>response.text

要找出问题是什么,我使用以下方法检出了返回的响应对象中的属性:

response.__dict__

但是,__dict__不会返回由于对象的父类而附加的属性。

我收到的响应对象的属性_body包含该页面的html。