0

我有一个项目,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

4 回答 4

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)

我想你试图抓住整个 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 
于 2013-01-02T14:40:33.533 回答
1

不,scrapy 不会为您执行此操作。根据标准,HTML 中的 URL 可以是绝对的或相对的。scrapy 将您提取的 url 视为数据,它无法知道它们是 url,因此您必须手动将相对 url 与基本 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'
>>> 
于 2013-01-02T12:24:51.213 回答
1

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

item['link'] = ['http://www.youtube.com%s'%a for a in site.select('div[2]/div/h3/a/@href').extract()]
于 2013-01-02T07:42:31.330 回答
1

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

于 2017-01-22T14:24:02.457 回答