[英]scrapy returning an empty object
我正在使用 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
}
在您的代碼中,您正在尋找 select 所有事件,但 output 將是一個列表,您不能 select 標題等使用 extract()
這就是為什么你沒有得到你想要的數據。 您將需要使用 for 循環來遍歷頁面上的每個事件,以在您的情況下遍歷all_div_activities
。
def parse(self,response):
all_div_activities = response.css('div.tribe-events-event-content')
for a in all_div_activities:
title = a.css('a.tribe-event-url::text').get()
if a.css('span.ticket-cost::text'):
price = a.css('span.ticket-cost::text').get()
else:
price = 'No price'
details = a.css('div[class*="tribe-events-list-event-description"] > p::text').get()
yield {
'title':title.strip(),
'price':price,
'details':details
}
筆記
作為一個小問題,Scrapy 建議使用 get() 和 getall() 方法,而不是 extract_first() 和 extract()。 使用 extract() 並不總是可以知道 output 是否會成為一個列表,在這種情況下,我得到的 output 是一個列表。 這就是為什么 scrapy 文檔建議改用 get() 的原因。 它也更緊湊。 使用 get() 你總是會得到一個字符串。 這也意味着我可以用標題去除換行符和空格,如您在上面的代碼中所見。
另一個提示是,如果 class 屬性很長,請使用 *= 選擇器,只要 select 的部分屬性為您想要的數據提供獨特的結果。 請參閱此處了解更多詳細信息。
從長遠來看,使用項目而不是產生字典可能會更好,因為您可以為頁面上的某些事件中您正在抓取的數據設置默認值,而其他事件則不是。 您必須通過管道來執行此操作(同樣,如果您不理解這一點,請不要擔心)。 有關項目的信息,請參閱文檔,並在此處了解有關項目的更多信息。
這是我的。 希望它會幫助你。
for item in response.css('div.tribe-events-event-content'):
print(item.css('a.tribe-event-url::text').get())
print(item.css('span.ticket-cost::text').get())
print(item.css('p::text').get())
謝謝。
以下是修復代碼的一些步驟
.span.ticket-cost::text
--> span.ticket-cost::text
也 .p .p::text
--> p::text
。get()
方法而不是返回列表的extract()
方法。>
select。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.