亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我在這里做錯了什么?parse_item_page 對我不起作用

我在這里做錯了什么?parse_item_page 對我不起作用

元芳怎么了 2023-03-08 10:10:25
import scrapyfrom ..items import dealItemclass FarmtoolsSpider(scrapy.Spider):    name = 'farmtools'    allowed_domains = ['www.deal.ie']    start_urls = ['https://www.deal.ie/all?source=private&sort=publishdate%20desc']    def parse(self, response):        items = dealItem()        rows = response.xpath('//ul[@class="card-collection"]/li')        for row in rows:            link = row.xpath('.//a/@href').get() #this is the full link.            link_split = link.split('/')[-1] #this splits the url link th first time.            linkid = link_split.split('?')[0] #this splits it the second time.            title = row.xpath('.//div[1]/p[@class="card__body-title"]/text()').get()            county = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/following-sibling::node()/text()').get()            price = row.xpath('.//p[@class="card__price"]/span[1]/text()').get()            subcat = row.xpath('.//a/div/div[2]/div[1]/p[2]/text()[2]').get()            zero = row.xpath('.//a/div/div[2]/div[1]/ul[@class="card__body-keyinfo"]/li[contains(text(),"min")]/text()').get()            if zero == '0 min':                items['linkid'] = linkid                items['title'] = title                items['county'] =  county                items['price'] = price                items['subcat'] = subcat                items['zero'] = zero            }第一個解析方法運行良好,但我不確定我是否正確編寫了第二個解析方法。第一個解析方法的一部分會抓取我想要跟蹤的特定鏈接,這樣我就可以從中抓取額外的數據。我想要實現的是抓取我從第一個解析方法獲得的鏈接并從中獲取其他項目值,然后將它們全部添加為項目。我也添加了items = DonedealItem()兩者,但我不確定這是正確的。當我現在運行它時,我得到:文件“/home/william/.local/lib/python3.7/site-packages/twisted/internet/defer.py”,第 654 行,在 _runCallbacks current.result = callback(current. result, *args, **kw) TypeError: parse_item_page() got an unexpected keyword argument 'donedeal.ie/cars-for-sale/e39-520i-for-breaking-also-have-lsd/…' 。對于每個被抓取的鏈接,我都會得到其中一個。我想要做的是向我從第一個解析方法中抓取的信息添加更多信息,如“賣家 ID”、“視圖”等。希望這可以幫助
查看完整描述

1 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

我可以發現您的代碼存在一些問題,包括您在評論中提到的錯誤原因,但問題仍然存在,因為我不完全理解您想要抓取的數據結構。


在您的parse方法中,您實例化了varDonedealItem()中的一個對象items。然后您嘗試將其作為回調參數 (cb_kwargs) 發送給回調函數 ( parse_item_page)。


      ...

      yield response.follow(url=link,

          callback=self.parse_item_page,

          cb_kwargs={link: items})


 def parse_item_page(self, response, link):

     ...

這里的問題是,這link是一個具有不可預測值的變量(因為您將其設置為 url),它需要是一個與您在回調函數中定義的值相同的字符串。所以這應該可以解決錯誤:


        yield response.follow(url=link,

            callback=self.parse_item_page,

            cb_kwargs={'link': items})

但是,您的parse_item_page方法沒有link任何用途。相反,它實例化一個新的DonedealItem(),用解析到這個方法中的數據填充它,然后產生它。作為參數接收的數據link未被使用。如果你想增加你第一個方法發送給你的數據parse,你需要使用它:


  def parse_item_page(self, response, link):

      items = link # Your link param already receives an DonedealItem instance.

這是一個提示:不需要這些花括號:


 yield{

     items

     }

改用yield items_


仍然存在的問題:


你可以把你想象DonedealItem成一個字典,你的代碼正在做的是首先實例化項目,然后運行一個 for 循環,并在這個循環的每次迭代中覆蓋你的項目中的數據。我相信你應該在 for 循環中實例化你的項目,但我不能確定,因為我不知道預期的結果是什么,也不知道是如何DonedealItem定義的。即便如此,這仍然會導致第二種解析方法出現問題,因為它接收到一個項目并再次迭代。也許你需要使用列表。


查看完整回答
反對 回復 2023-03-08
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號