我正在努力与React在scrappy和不断得到这个消息。
我只给出了发生错误的代码片段。我正在尝试浏览不同的网页,需要获得该特定网页中的页面数。所以我创建了一个响应对象,在该对象中,我获得了next按钮的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)
`
3条答案
按热度按时间jljoyd4f1#
在这种情况下,发生错误的行需要
TextResponse
对象,而不是正常响应。尝试创建TextResponse
而不是正常的Response
来解决错误。此处记录了缺少的方法。
更具体地说,使用
HtmlResponse
,因为您的响应将是一些HTML而不是纯文本。HtmlResponse
是TextResponse
的子类,因此它继承了缺少的方法。还有一件事你在哪里设置
Response
的主体?如果没有任何主体,你的xpath
查询将不会返回任何结果。就你的问题中的示例而言,你只设置了URL,而没有设置主体。这就是为什么你的xpath
不会返回任何结果。y4ekin9u2#
这并不能真正回答这个问题,但可以用来查找返回的响应对象的问题。我将它作为答案添加进来,以便它可以帮助某些人调试他们所面临的问题。
我也曾遇到过类似的错误:
AttributeError: 'HtmlResponse' object has no attribute 'text'
当我这样做时:为了找出问题所在,我使用以下命令检查了返回的响应对象中存在的属性:
但是,
__dict__
不会返回由于对象的父类而附加的属性。我收到的响应对象的属性为
_body
,其中包含该页面的html。k2arahey3#
这是一个2022年的回应,因为这个问题首先在谷歌上弹出的错误。
TextResponse.body_as_unicode
已过时并被删除(link),因此请改用TextResponse.text
。