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'],

後でリストを再編集する代わりに、スクレイピーでこれを直接行うことは可能ですか?

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全体を取得して正しく解析しようとしていると思いますか?その場合、シンプルな 2 つのメソッド システムが 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

リストとしてリンクが本当に必要な場合は、それで問題ありません。

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

いいえ、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

USE : response.urljoin() 絶対 URL を直接抽出する方法はありません。response.urljoin() を使用して、コールバックの助けを借りて解析される別の解析関数を作成する必要があります。この 2 番目の解析関数では、必要なものを何でも抽出できます。

于 2017-01-22T14:24:02.457 に答える