scrapy和相对路径

时间:2014-03-04 22:17:15

标签: python scrapy

我对python并不简单,我已经尝试了几个小时来从列表中的多个元素中删除几个字符。我想跟蜘蛛一起使用的所有废弃链接都是相对的,这里只是输出的几行:

 [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'

任何建议表示赞赏。

2 个答案:

答案 0 :(得分: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 :(得分:1)

您传递给string方法的complete_url参数中的值是一个列表,而不是您期望的字符串。

这样做:

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