2014-03-04 80 views
2

我不是直接用python,我一直在嘗試幾個小時來切斷列表中多個元素的少量字符。我想跟隨我的蜘蛛全部報廢環節是相對的,這裏是我的輸出只有幾行:scrapy和相對路徑

[u'../../../info/Auto/Dutch/'] 
[u'../../../info/Automazing/All_Star/'] 
[u'../../../info/AutoW/Passion/'] 

我試圖擺脫

"../../.." 

這是我的代碼:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('//div[@class="partInnerDiv"]/table/tbody/tr') 
    items = [] 
    for link in links: 
     item = myItem() 
     item ['url'] = link.select('th/a/@href').extract() 
     print complete_url(item ['url']) 
     items.append(item)    
    return items 

    def complete_url(string): 
    url = string 
    #if string.startswith("../"): 
    # return string[5:] 
    return url.replace('../../', '') 

從上面的代碼中,你可以看到,我試了幾個方法,但沒有爲我工作:(

exceptions.AttributeError: 'list' object has no attribute 'replace' 

任何意見讚賞。

回答

1

傳遞給complete_url方法的參數string中的值是一個列表,而不是您期望的那樣的一個字符串。

這樣做:

def complete_url(string): 
    url = string[0] 
    return url.replace('../../', '') 
+0

感謝提示,我認爲它可能是這樣的:)它的痛苦,當你不明白的概念一個語言:( – mrki

3

您正在尋找urlparse.urljoin()

import urlparse 

urlparse.urljoin(u'http://www.mysite.com/a/b/c/', u'../../../info/Auto/Dutch/') 

# => u'http://www.mysite.com/info/Auto/Dutch/' 

在你的回調將成爲:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('//div[@class="partInnerDiv"]/table/tbody/tr') 
    items = [] 
    for link in links: 
     item = myItem() 
     item ['url'] = [urlparse.urljoin(response.url, u) 
         for u in link.select('th/a/@href').extract()] 
     items.append(item)    
    return items 

此代碼假定的Python 2.x的;在Python 3中,函數已被重命名爲urllib.parse.urljoin(),但Scrapy目前不能與Python 3一起工作。

+1

我加了一個關於如何在OP代碼中使用'urlparse.urljoin()'的例子。希望它可以和你一起 –

+0

@pault .:它看起來不錯,謝謝你的幫助! –

+0

@paul ...謝謝尋求幫助!我會重新考慮urlparse.urljoin():在下一個蜘蛛:) – mrki