我使用的是css选择器,并不断得到一个空值的响应。
import scrapy
class WebSpider(scrapy.Spider):
name = 'activities'
start_urls = [
'http://capetown.travel/events/'
]
def parse(self, response):
all_div_activities = response.css("div.tribe-events-content")#gdlr-core-pbf-column gdlr-core-column-60 gdlr-core-column-first
title = all_div_activities.css("h2.tribe-events-list-event-title::text").extract()#gdlr-core-text-box-item-content
price = all_div_activities.css(".span.ticket-cost::text").extract()
details = all_div_activities.css(".p::text").extract()
yield {
'title':title,
'price':price,
'details':details
}
3条答案
按热度按时间iqih9akk1#
在你的代码中,你希望选择所有的事件,但输出将是一个列表,你不能选择标题等使用extract()与一个列表,因为你试图这样做。
这就是为什么你没有得到你想要的数据。你需要使用一个for循环来循环页面上的每个事件,在你的例子中循环
all_div_activities
。脚本代码
备注
1.对price使用if语句,因为有些元素根本没有price,所以输入一些信息是一个好主意。
1.当产生字典时,在标题上使用strip(),因为标题有空格和附加的\n。
建议
作为次要的一点,Scrapy建议使用get,()并获取()方法而不是extract_first()并提取().带摘录()并不总是能够知道输出是否是列表,在这个例子中,我得到的输出是一个列表,这就是为什么ScrapyDocs建议使用get()。它也更紧凑。使用get(),你总是会得到一个字符串。这也意味着我可以去掉换行符和标题空格,就像你在上面的代码中看到的那样。
另一个提示是如果class属性很长,只要你选择的partial属性能为你想要的数据提供唯一的结果,就使用 *=选择器。
从长远来看,使用项目而不是生成字典可能更好,因为您可以为页面上某些事件中的数据设置默认值,而在其他事件中则不是。您必须通过管道来完成这一点(如果您不理解这一点,也不用担心)。请参阅项目的文档,并参阅here以了解更多关于项目的信息。
q5iwbnjs2#
这是我的,希望对你有帮助。
kx5bkwkv3#
下面是修复代码的一些步骤
.span.ticket-cost::text
--〉span.ticket-cost::text
也改为.p::text
--〉p::text
。get()
方法,而不是返回列表的extract()
方法。>
。