2013-01-02 74 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()并创建另一个解析函数,这个函数在回调的帮助下被解析。在这第二个解析函数中,你可以提取任何你想要的。