我对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'
任何建议表示赞赏。
答案 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('../../', '')