2016-02-26 11 views
5

bir liste çıkmıyor:Neden selektör döngü içinde xpath hala öğretici ile scrapy öğreniyorum öğretici

Ben öğretici Aşağıdaki örnek komut dosyasını çalıştırın http://doc.scrapy.org/en/1.0/intro/tutorial.html. Seçici listeden çoktan geçmesine rağmen, sel.xpath('a/text()').extract()'dan aldığım karo hala bir dizgi içeren bir listeydi. u'Python 3 Object Oriented Programming' yerine [u'Python 3 Object Oriented Programming'] gibi. Daha sonraki bir örnekte liste, mantıksal olarak doğru olmadığını düşündüğüm item['title'] = sel.xpath('a/text()').extract() olarak öğeye atanır.

import scrapy 

class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/", 
    ] 

    def parse(self, response): 
     for href in response.css("ul.directory.dir-col > li > a::attr('href')"): 
      link = href.extract() 
      print(link) 

link bir dize yerine bir listesi:

import scrapy 

class DmozSpider(scrapy.Spider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
    ] 

    def parse(self, response): 
     for sel in response.xpath('//ul/li'): 
      title = sel.xpath('a/text()').extract() 
      link = sel.xpath('a/@href').extract() 
      desc = sel.xpath('text()').extract() 
      print title, link, desc 

Ancak şu kodu kullanın eğer.

Bu bir hata mıdır, yoksa amaçlanmıştır?

cevap

8

.xpath().extract() ve .css().extract() dönüş listesi .xpath() ve .css() dönüş SelectorList nesneler çünkü.

https://parsel.readthedocs.org/en/v1.0.1/usage.html#parsel.selector.SelectorList.extract

(SelectorList) .extract() Bkz:

Çağrı .extract() her elemanı için yöntem bu liste ve Unicode dizeleri listesi olarak, onların sonuçlar düzleştirilmiş dönün. Eğer sadece ilk eşleşen öğe elde etmek istiyorsanız

, sen seçici .extract_first()

çağırabilirsiniz:

.extract_first() sen (kötü belgelenmiş olan)

http://doc.scrapy.org/en/latest/topics/selectors.html Alındığı aradığınız budur

>>> response.xpath('//div[@id="images"]/a/text()').extract_first() 
u'Name: My image 1 ' 

0 Diğer örnekte

: döngü içinde

def parse(self, response): 
    for href in response.css("ul.directory.dir-col > li > a::attr('href')"): 
     link = href.extract() 
     print(link) 

her href bir Selector nesne olacak.Üzerinde .extract() çağrılması geri size tek bir Unicode dizesi alacak:

In [5]: for href in response.css("ul.directory.dir-col > li > a::attr('href')"): 
    ...:  print href 
    ...:  
<Selector xpath=u"descendant-or-self::ul[@class and contains(concat(' ', normalize-space(@class), ' '), ' directory ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' dir-col '))]/li/a/@href" data=u'/Computers/Programming/Languages/Python/'> 
<Selector xpath=u"descendant-or-self::ul[@class and contains(concat(' ', normalize-space(@class), ' '), ' directory ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' dir-col '))]/li/a/@href" data=u'/Computers/Programming/Languages/Python/'> 
(...) 
<Selector xpath=u"descendant-or-self::ul[@class and contains(concat(' ', normalize-space(@class), ' '), ' directory ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' dir-col '))]/li/a/@href" data=u'/Computers/Programming/Languages/Python/'> 
:

In [2]: type(response.css("ul.directory.dir-col > li > a::attr('href')")) 
Out[2]: scrapy.selector.unified.SelectorList 

o nesne üzerinde döngü size Selector örneklerini verir:

böylece .css() response üzerinde
$ scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/" 
2016-02-26 12:11:36 [scrapy] INFO: Scrapy 1.0.5 started (bot: scrapybot) 
(...) 
In [1]: response.css("ul.directory.dir-col > li > a::attr('href')") 
Out[1]: 
[<Selector xpath=u"descendant-or-self::ul[@class and contains(concat(' ', normalize-space(@class), ' '), ' directory ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' dir-col '))]/li/a/@href" data=u'/Computers/Programming/Languages/Python/'>, 
<Selector xpath=u"descendant-or-self::ul[@class and contains(concat(' ', normalize-space(@class), ' '), ' directory ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' dir-col '))]/li/a/@href" data=u'/Computers/Programming/Languages/Python/'>, 
... 
<Selector xpath=u"descendant-or-self::ul[@class and contains(concat(' ', normalize-space(@class), ' '), ' directory ') and (@class and contains(concat(' ', normalize-space(@class), ' '), ' dir-col '))]/li/a/@href" data=u'/Computers/Programming/Languages/Python/'>] 

bir SelectorList döndürür

.extract()'u arayarak size tek bir Unicode str verir. ing:

In [6]: for href in response.css("ul.directory.dir-col > li > a::attr('href')"): 
    print type(href.extract()) 
    ...:  
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 
<type 'unicode'> 

Not: .extract()Selector üzerine dizeleri listesini dönen olarak wrongly documented olduğunu. parsel (Scrapy seçicileri ile aynıdır ve scrapy 1.1+ sürümünde kullanılan kaputun altında kullanılır) ile ilgili bir sorun açacağım

+0

Hızlı cevap için teşekkürler! Sadece yazıyı düzenledim ve öğreticiden 'extract()' bir dizge verdiğini ekledim. Bu css kullanıyorum çünkü mi? – entron

+0

Doğru, yazdığım şey doğru değil (bir cevap çok hızlı). Aslında .xpath(). Extract() 've' .css(). Extract() 'döndürme listeleri çünkü' .xpath() 've' .css() '' SelectorList' nesnelerini döndürür. Ama .xpath() 'da döngü yaparak, size“ .extract() ”diyebilmeniz ve tek bir eleman almanız için bir“ Selector ”vermeniz gerekir. Cevabımı düzeltirim –

+0

Bu bölüm gerçekten kafa karıştırıcı, ama şimdi anlıyorum! Çok teşekkür ederim! – entron