我有一个以下表单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中执行此操作,而不是之后重新编辑列表?
答案 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()并创建另一个在回调的帮助下解析的解析函数。在第二个解析函数中,您可以提取您想要的任何内容。