Scrapy修改链接以包含域名

时间:2013-01-02 05:04:17

标签: python scrapy

我有一个以下表单item['link']的项目:

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中执行此操作,而不是之后重新编辑列表?

4 个答案:

答案 0 :(得分: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上工作。 parse方法找到链接,将其发送到parse_url方法,该方法输出你要提取到管道的内容

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

你确实需要链接作为列表,对你来说没问题。

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

答案 2 :(得分:1)

不,scrapy不会为你做这件事。根据标准,HTML中的URL可以是绝对的或相对的。 scrapy看到你提取的url就像数据一样,它不能知道它们是url,所以你必须手动加入相对url和base url。

您需要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'
>>> 

答案 3 :(得分:1)

使用: response.urljoin() 没有这种方法可以直接提取绝对URL。您必须使用response.urljoin()并创建另一个在回调的帮助下解析的解析函数。在第二个解析函数中,您可以提取您想要的任何内容。