2012-09-03 3 views
5

Solo provando a cercare di far funzionare un ragno di base. So che questo è probabilmente qualcosa che mi manca ma ho provato tutto quello che riesco a pensare.Scrapy HtmlXPathSelector

L'errore che ottengo è:

line 11, in JustASpider 
    sites = hxs.select('//title/text()') 
NameError: name 'hxs' is not defined 

Il mio codice è molto semplice in questo momento, ma io ancora non riesco a trovare dove sto andando male. Grazie per qualsiasi aiuto!

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

class JustASpider(BaseSpider): 
    name = "google.com" 
    start_urls = ["http://www.google.com/search?hl=en&q=search"] 


    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//title/text()') 
     for site in sites: 
      print site.extract() 


SPIDER = JustASpider() 
+0

Come gestisci il tuo ragno? "scrapy crawl" google.com "'? – Leo

+0

Non c'è niente di sbagliato nel tuo codice (oltre a non dover più dichiarare lo SPIDER), funziona per me. –

+0

@Leo Ecco come l'ho eseguito. –

risposta

6

Ho rimosso la chiamata di SPIDER alla fine e rimosso il ciclo for. C'era solo un tag title (come ci si aspetterebbe) e sembra che stia buttando fuori dal giro. Il codice che ho a lavorare è la seguente:

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

class JustASpider(BaseSpider): 
    name = "google.com" 
    start_urls = ["http://www.google.com/search?hl=en&q=search"] 


    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.select('//title/text()') 
     final = titles.extract() 
+0

il tuo codice funziona, ma è meglio usare un nome semplice per gli spider, come "google" o "googleSpider" invece di "google.com" – parik

0

Assicurati di utilizzare il codice che ci stai mostrando.

Provare a eliminare i file *.pyc nel progetto.

+0

Dopo aver eliminato tutti i file pyc nella cartella, sto ancora ricevendo lo stesso errore. Se mi mancasse una dipendenza, ricevo un errore di importazione? –

+0

controllare i rientri nel codice. magari mischi le schede con gli spazi? – warvariuc

2

Ho avuto un problema simile, NameError: name 'hxs' is not defined, e il problema relativo agli spazi e le schede: l'IDE utilizza spazi invece di tabulazioni, si dovrebbe check it out.

0

questo funziona per me:

  1. Salvare il file come test.py
  2. Utilizzare il comando scrapy runspider <filename.py>

Ad esempio:

scrapy runspider test.py 
1

codice sembra corretto.

Nelle ultime versioni di Scrapy
HtmlXPathSelector è obsoleto. Usa Selector:

hxs = Selector(response) 
sites = hxs.xpath('//title/text()') 
0

questa è solo una demo, ma funziona. bisogno di essere personalizzato offcourse. !

/usr/bin/env python

da scrapy.spider importazione BaseSpider da scrapy.selector importazione HtmlXPathSelector

classe DmozSpider (BaseSpider): 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): 
    hxs = HtmlXPathSelector(response) 
    sites = hxs.select('//ul/li') 
    for site in sites: 
     title = site.select('a/text()').extract() 
     link = site.select('a/@href').extract() 
     desc = site.select('text()').extract() 
     print title, link, desc 
0

Si dovrebbe cambiare

from scrapy.selector import HtmlXPathSelector 

in

from scrapy.selector import Selector 

E utilizzare hxs=Selector(response) invece.

5

Il codice sembra una versione piuttosto vecchia. Mi consiglia di utilizzare questi codici al posto

from scrapy.spider import Spider 
 
from scrapy.selector import Selector 
 

 
class JustASpider(Spider): 
 
    name = "googlespider" 
 
    allowed_domains=["google.com"] 
 
    start_urls = ["http://www.google.com/search?hl=en&q=search"] 
 

 

 
    def parse(self, response): 
 
     sel = Selector(response) 
 
     sites = sel.xpath('//title/text()').extract() 
 
     print sites 
 
     #for site in sites: (I dont know why you want to loop for extracting the text in the title element) 
 
      #print site.extract()
speriamo vi sia utile e here è un buon esempio da seguire.

0

Uso Scrapy con BeautifulSoup4.0. Per me, Soup è facile da leggere e capire. Questa è un'opzione se non si deve usare HtmlXPathSelector. Spero che questo ti aiuti!

import scrapy 
from bs4 import BeautifulSoup 
import Item 

def parse(self, response): 

    soup = BeautifulSoup(response.body,'html.parser') 
    print 'Current url: %s' % response.url 
    item = Item() 
    for link in soup.find_all('a'): 
     if link.get('href') is not None: 
      url = response.urljoin(link.get('href')) 
      item['url'] = url 
      yield scrapy.Request(url,callback=self.parse) 
      yield item