Python Scrapy修改链接以包含域名

Python Scrapy修改链接以包含域名,python,scrapy,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&

我有一个项目,
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中直接执行此操作,而不是在以后重新编辑列表?

您确实需要链接作为列表,这对您来说很好

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

您确实需要链接作为列表,这对您来说很好

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

不,scrapy不是为你做的。根据标准,HTML中的URL可以是绝对的,也可以是相对的。scrapy将您提取的url视为数据,它无法知道它们是url,所以您必须手动将相对url与基本url连接起来

你需要:


不,scrapy不是为你做的。根据标准,HTML中的URL可以是绝对的,也可以是相对的。scrapy将您提取的url视为数据,它无法知道它们是url,所以您必须手动将相对url与基本url连接起来

你需要:


是的,每次我抓取链接时,我都必须使用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)
我想象你试图抓取整个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 

是的,每次我抓取链接时,我都必须使用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)
我想象你试图抓取整个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 
使用:
response.urljoin()
目前还没有直接提取绝对url的方法。您必须使用response.urljoin()并创建另一个解析函数,在回调的帮助下解析该函数。在第二个解析函数中,您可以提取您想要的任何内容。

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