簡體   English   中英

scrapy 返回一個空的 object

[英]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
              }

筆記

  1. 使用 if 語句作為價格,因為有些元素根本沒有價格,因此輸入一些信息是個好主意。
  2. 在生成字典時在標題上使用 strip(),因為標題有空格和 \n 附加。

建議

作為一個小問題,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()) 

謝謝。

以下是修復代碼的一些步驟

  • 當在表示元素的 class 名稱而不是 HTML 標簽本身的名稱之前使用句點時。因此更改.span.ticket-cost::text --> span.ticket-cost::text也 .p .p::text --> p::text
  • 顯然你試圖獲取一個字符串,所以使用get()方法而不是返回列表的extract()方法。
  • 確保在所需文本位於您擁有的元素的子元素內時使用> select。
  • 最后這里是 CSS 選擇器參考https://www.w3schools.com/cssref/css_selectors.asp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM