2012-09-03 15 views
5

Einfach ausprobieren scrapy und versuchen, eine grundlegende Spinne zu arbeiten. Ich weiß, das ist wahrscheinlich etwas, das ich vermisse, aber ich habe alles versucht, was mir einfällt.Scrapy HtmlXPathSelector

Der Fehler, den ich bekommen ist:

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

Mein Code ist im Moment sehr einfach, aber ich kann immer noch nicht zu finden scheinen, wo ich falsch gehe. Danke für jede Hilfe!

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

Wie laufen Sie Ihre Spinne? 'scrapy crawl" google.com "'? – Leo

+0

Es ist nichts falsch mit Ihrem Code (abgesehen davon, dass Sie SPIDER nicht mehr deklarieren müssen), es funktioniert für mich. –

+0

@Leo So habe ich es ausgeführt. –

Antwort

6

Ich entfernte den SPIDER-Aufruf am Ende und entfernte die for-Schleife. Es gab nur einen Title-Tag (wie man es erwarten würde) und es scheint, als würde er die Schleife abwerfen. Der Code, den ich habe Arbeit ist wie folgt:

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

Ihr Code funktioniert, aber es ist besser, einen einfachen Namen für die Spider zu verwenden, wie "google" oder "googleSpider" anstelle von "google.com" – parik

0

Vergewissern Sie sich, dass Sie den Code ausführen, den Sie uns zeigen.

Versuchen Sie, *.pyc Dateien in Ihrem Projekt zu löschen.

+0

Nach dem Löschen aller Pyc-Dateien im Ordner bekomme ich immer noch den gleichen Fehler. Wenn ich eine Abhängigkeit vermisse, würde ich einen Importfehler bekommen? –

+0

Bitte überprüfen Sie die Einrückung in Ihrem Code. vielleicht mischen Sie Tabs mit Leerzeichen? – warvariuc

2

Ich hatte ein ähnliches Problem, NameError: name 'hxs' is not defined, und das Problem zu Leerzeichen und Tabulatoren bezogen werden: die IDE verwendet Leerzeichen anstelle von Tabulatoren, sollten Sie es überprüfen.

0

Dies funktioniert für mich:

  1. Speichern Sie die Datei als test.py
  2. Verwenden Sie den Befehl scrapy runspider <filename.py>

Zum Beispiel:

scrapy runspider test.py 
1

-Code korrekt aussieht.

In den neuesten Versionen von Scrapy
HtmlXPathSelector ist veraltet. Verwendung Selector:

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

das ist nur eine Demo, aber es funktioniert. müssen natürlich angepasst werden. !

/usr/bin/env python

von scrapy.spider Import BaseSpider von scrapy.selector Import HtmlXPathSelector

Klasse 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

sollten Sie

from scrapy.selector import HtmlXPathSelector 

in

from scrapy.selector import Selector 

Und statt hxs=Selector(response) verwenden ändern.

5

Der Code sieht ziemlich alt aus. Ich empfehle diese Codes anstelle

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()
hoffen, es hilft und here ist ein gutes Beispiel zu folgen.

0

Ich benutze Scrapy mit BeautifulSoup4.0. Für mich ist Suppe leicht zu lesen und zu verstehen. Dies ist eine Option, wenn Sie HtmlXPathSelector nicht verwenden müssen. Hoffe das hilft!

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