2017-05-18 3 views
0

Ich bin eine Spinne, die Daten in DynamoDB speichert. Ich habe StackOverflow nach einer Antwort gesucht, konnte sie aber nicht finden. Es speichert stamp und title in DynamoDB mit allen anderen Zeichen wie/u und Klammern. url werden ordnungsgemäß gespeichert, ohne zusätzliche Zeichen. Wie kann ich es ohne sie sparen?Scrapy liefert Artikel an die DB mit/u

Meine Spinne:

def parse(self, response): 

    for item in response.xpath("//li[contains(@class, 'river-block')]"): 
     url = item.xpath(".//h2[@class='post-title']/a/@href").extract()[0] 
     stamp = item.xpath(".//time/@datetime").extract() 
     yield scrapy.Request(url, callback=self.get_details, meta={'stamp': stamp}) 

def get_details(self, response): 
     article = ArticleItem() 
     article['title'] = response.xpath("//h1/text()").extract() 
     article['url'] = format(shortener.short(response.url)) 
     article['stamp'] = response.meta['stamp'] 
     yield article 

Meine Pipelines Datei:

class DynamoDBStorePipeline(object): 

def process_item(self, item, spider): 
    dynamodb = boto3.resource('dynamodb',region_name="us-west-2") 

    table = dynamodb.Table('TechCrunch') 

    table.put_item(
    Item={ 
    'url': str(item['url']), 
    'title': str(item['title']), 
    'stamp': str(item['stamp']), 
    } 
    ) 
    return item 

Beispielausgabe:
url: ein Link (es ist in Ordnung)
Stempel: [u'2017-05-17 08:06:47 ']
titel: [utitle']

+1

bitte Beispielwerte von 'title' bieten,' sample' und 'url' und erwarteten Ausgang, auch die URL-Website Sie versuchen zu verschrotten. – JkShaw

+0

Verwenden Sie 'extract_first()' anstelle von 'extract()', falls dies Ihr Problem nicht löst, geben Sie update post mit dem Link, den Sie scrapen. – JkShaw

+0

@JkShaw arbeitete wie ein Charme. Danke mein Herr. Kannst du es bitte als Antwort schreiben, damit ich deine Antwort annehmen und annehmen kann? – yurashark

Antwort

0

In Scrapy eins kann extract verwenden, um textual data zu erhalten, aber wenn Sie extract nur first matched element möchten, können Sie den Selektor extract_first() aufrufen.

In Ihrem Fall Update stamp und title muss Selektor extract_first() sein wie folgt:

def parse(self, response): 

    for item in response.xpath("//li[contains(@class, 'river-block')]"): 
     url = item.xpath(".//h2[@class='post-title']/a/@href").extract_first() 
     stamp = item.xpath(".//time/@datetime").extract_first() 
     yield scrapy.Request(url, callback=self.get_details, meta={'stamp': stamp}) 

def get_details(self, response): 
     article = ArticleItem() 
     article['title'] = response.xpath("//h1/text()").extract_first() 
     article['url'] = format(shortener.short(response.url)) 
     article['stamp'] = response.meta['stamp'] 
     yield article 
Verwandte Themen