2016-08-03 20 views
0

Ich baue eine Scrapy-Spinne, die die XPath-Abfrage als Eingabeparameter verwendet.Übergabe der xPath-Übersetzungsfunktion in Scrapy funktioniert nicht für Sonderzeichen

Die spezifische Seite, die ich versuche zu kratzen, hat Zeilenvorschübe, neue Zeilen und andere Zeichen innerhalb des Preistextfeldes und ich benutze die translate() Funktion, um sie zu entfernen.

Der Selektor funktioniert gut mit dem Translate, wenn er explizit im Code enthalten ist, aber der Translate funktioniert nicht, wenn er als Parameter übergeben wird.

Hier ist meine Spinne:

import scrapy 
from spotlite.items import SpotliteItem 


class GenericSpider(scrapy.Spider): 
    name = "generic" 
    xpath_string = "" 

    def __init__(self, start_url, allowed_domains, xpath_string, *args, **kwargs): 
     super(GenericSpider, self).__init__(*args, **kwargs) 
     self.start_urls = ['%s' % start_url] 
     self.allowed_domains = ['%s' % allowed_domains] 
     self.xpath_string = xpath_string 

    def parse(self, response): 
     self.logger.info('URL is %s', response.url) 
     self.logger.info('xPath is %s', self.xpath_string) 
     item = SpotliteItem() 
     item['url'] = response.url 
     item['price'] = response.xpath(self.xpath_string).extract() 
     return item 

und ich verwende die im Anschluss an die Spinne zu nennen.

scrapy crawl generic -a start_url=https://www.danmurphys.com.au/product/DM_4034/penfolds-kalimna-bin-28-shiraz -a allowed_domains=danmurphys.com.au -a "xpath_string=translate((//span[@class='price'])[1]/text(),',$\r\n\t','')" 

Das Problem scheint bestimmte Zeichen im Argument zu übergeben, d. H. \ R \ n \ t.

Das '$' Zeichen wurde korrekt entfernt, aber die \ r \ n \ t Zeichen entsprechen nicht der Ausgabe unten.

{'price': [u'\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t27.50\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t'], 
'url': 'https://www.danmurphys.com.au/product/DM_4034/penfolds-kalimna-bin-28-shiraz.jsp;jsessionid=B0211294F13A980CA41261379CD83541.ncdlmorasp1301?bmUID=loERXI6'} 

Jede Hilfe oder Beratung wird geschätzt!

Danke,

Michael

Antwort

0

Versuchen Sie, die normalize-space() XPath-Funktion in Ihrem Selektor:

scrapy crawl generic -a start_url=<URL> -a \ 
    allowed_domains=danmurphys.com.au \ 
    -a "xpath_string=normalize-space(//span[@class='price'][1]/text())" 

In Ihrem parse Methode können Sie die extract_first() verwenden den Preis als eine Zeichenkette zu erhalten Objekt, anstelle einer Liste:

item['price'] = response.xpath(self.xpath_string).extract_first() 

Sie könnten auch die re_first() Methode das $ Zeichen aus der Zeichenfolge entfernen:

item['price'] = response.xpath(self.xpath_string).re_first("\$(.+)") 
Verwandte Themen