2014-03-01 16 views
2
exceptions.TypeError: Request url must be str or unicode, got list: 

上面是我收到的錯誤,是我的縮進嗎?這段代碼應該使用它從scrapy中提取的鏈接來提取第一個div中的第二段,但我得到這個錯誤

這是我的代碼。

from scrapy.spider import BaseSpider 
from bathUni.items import BathuniItem 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http.request import Request 
from urlparse import urljoin 

class recursiveSpider(BaseSpider): 
    name = 'recursive2' 
    allowed_domains = ['http://www.bristol.ac.uk/'] 
    start_urls = ['http://www.bristol.ac.uk/international/countries/'] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     links = [] 

     for i in range(1, 154): 
      xpath = ('//*[@id="all-countries"]/li[*]/ul/li[*]/a/@href' .format (i+1)) 
      link = hxs.select(xpath).extract() 
      links.append(link) 

     for link in links: 
      yield Request(link, callback=self.parse_linkpage) 

    def parse_linkpage(self, response): 
     hxs = HtmlXPathSelector(response) 
     item = BathuniItem() 
     item ['Qualification'] = hxs.select('//*[@id="uobcms-content"]/div/div/div[1]/p[2]').extract() 

     yield item 

我如何得到這個工作,並按照第一頁的鏈接從鏈接中提取數據?任何例子都會很棒。

+0

請提供完整的追蹤 – jonrsharpe

+0

您正在使用哪種版本的scrapy?另外,你能舉一個你想要從每個國家頁面上刮取的信息的例子嗎? – Talvalin

回答

2

基於scrapy API,hxs.seletct(...).extract()返回一個列表。因此,在您的代碼中,links是列表的列表,因此Request(link,...)的調用失敗,因爲link應該是字符串或unicode。

如果您確信您只想從extract()處理的第一個結果,你可以簡單地你追加的方式改變links這樣的:

links.append(link[0]) 

如果你想從extract()處理所有結果,改變append這樣:

links.extend(link) 

另外,我不知道爲什麼你在parse_linkpage使用yield。由於在該功能中沒有循環,因此yield將或多或少地表現爲return(並且return將更傳統且高效)。請注意,parse_linkpage也將返回一個列表(同樣來自extract()的結果)。

+0

更改了一些這些東西后,我現在收到此錯誤:在請求url中缺少方案。 – Dyl10

+0

它在刮掉的鏈接上給出了這個錯誤,我相信修復的方法是將http://bristol.ac.uk添加到scaped鏈接上,但我不知道如何去做,因爲我看不到這些鏈接。 – Dyl10

+0

對不起,再次打擾你,但我現在得到一個錯誤:在分配 – Dyl10

0

檢查起始URL並檢查HTML後,範圍循環是不必要的。使用足夠合格的xpath查詢,可以在單個select語句中爲每個國家/地區提取所有相關URL。

爲此,我已經清理了parse函數。所有需要的國家/地區網址都被解析,但我不太確定每個國家/地區頁面的哪一部分需要被刪除,因此這些項目仍然是空的。

class recursiveSpider(BaseSpider): 
    name = 'recursive2' 
    allowed_domains = ['bristol.ac.uk'] 
    start_urls = ['http://www.bristol.ac.uk/international/countries/'] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     links = hxs.select('//*[@id="all-countries"]/li/ul/li/a/@href').extract() 
     abs_links = ['http://www.bristol.ac.uk' + x for x in links] 

     for link in abs_links: 
      yield Request(link, callback=self.parse_linkpage) 
相關問題