2013-01-02 106 views
0

我有一個項目,item['link'],這種形式的:Scrapy修改鏈接到包括域名

item['link'] = site.select('div[2]/div/h3/a/@href').extract() 

的聯繫它的提取物是這種形式的:

'link': [u'/watch?v=1PTw-uy6LA0&list=SP3DB54B154E6D121D&index=189'], 

我想他們是這個方式:

'link': [u'http://www.youtube.com/watch?v=1PTw-uy6LA0&list=SP3DB54B154E6D121D&index=189'], 

是否可以直接在scrapy中做到這一點,而不是之後重新編輯列表?

回答

1

你真的需要鏈接作爲一個清單,它會適合你。

item['link'] = ['http://www.youtube.com%s'%a for a in site.select('div[2]/div/h3/a/@href').extract()] 
1

不,scrapy不會爲你做這個。根據標準,HTML中的URL可能是絕對的或相對的。 scrapy會將數據提取爲網址,但它不知道它們是網址,因此您必須手動將網址與基本網址結合起來。

您需要urlparse.urljoin

Python 2.7.3 (default, Sep 26 2012, 21:51:14) 
>>> import urlparse 
>>> urlparse.urljoin('http://www.youtube.com', '/watch?v=1PTw-uy6LA0&list=SP3DB54B154E6D121D&index=189') 
'http://www.youtube.com/watch?v=1PTw-uy6LA0&list=SP3DB54B154E6D121D&index=189' 
>>> 
2

是啊,每次我抓住一個環節我都用的方法urlparse.urljoin。

def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select('//a[contains(@href, "content")]/@href').extract() ## only grab url with content in url name 
     for i in urls: 
      yield Request(urlparse.urljoin(response.url, i[1:]),callback=self.parse_url) 

我想你試圖抓住整個網址來解析它嗎?如果是這樣的話,一個簡單的兩個方法系統就可以在一個basespider上工作。解析方法找到的鏈接,它會向它輸出你提取什麼管道

def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     urls = hxs.select('//a[contains(@href, "content")]/@href').extract() ## only grab url with content in url name 
     for i in urls: 
      yield Request(urlparse.urljoin(response.url, i[1:]),callback=self.parse_url) 


def parse_url(self, response): 
    hxs = HtmlXPathSelector(response) 
    item = ZipgrabberItem() 
    item['zip'] = hxs.select("//div[contains(@class,'odd')]/text()").extract() ## this grabs it 
    return item 
1

使用parse_url方法:response.urljoin() 有沒有這樣的方法直接提取絕對URL。你必須使用response.urljoin()並創建另一個解析函數,這個函數在回調的幫助下被解析。在這第二個解析函數中,你可以提取任何你想要的。