2016-08-07 21 views
4

Ich bin neu in Python und habe ein paar Probleme mit meinem Kopf um bestimmte Werte oder Schlüssel aus einer Liste zu bekommen.Scrapy von der Liste, um Schlüssel oder Wert zu extrahieren

Wenn mein scraped Item seinen Wert ausgibt, bekomme ich manchmal eine Rückkehr wie diese.

erste Liste:

'image_urls': [u'http://www.websites.com/1.jpg', 
       u'http://www.websites.com/2.jpg', 
       u'http://www.websites.com/3.jpg'], 

Jetzt habe ich um diese gearbeitet durch eine gezieltere XPath tun und Elemente durch Zahlen Sie [2], aber mein eigentliches Problem ist mit diesen Erträgen aus den abgekratzten Bildern

zweite Liste:

'images': [{'checksum': '2efhz768djdzs76dz', 
      'path': 'full/2efhz768djdzs76dz.jpg', 
      'url': 'http://www.websites.com/1.jpg'}, 
      {'checksum': 'zadz764dhqj34dsjs', 
      'path': 'full/zadz764dhqj34dsjs.jpg', 
      'url': 'http://www.websites.com/2.jpg'}], 

i sqlite3 bin mit speichern al meine anderen geschabt Daten mit einem item.get

item.get (‚image_urls‘, ‚‘)

wie fusionieren Sie eine Liste der Wert der in einen String oder auf seinen Rang Ziel basiert? (erste Liste)

und wie bekomme ich den Wert für die Prüfsumme, Pfad und URL mit einem item.get? (Zweite Liste)

Edit: Ich bin immer noch für eine Lösung des zweiten Problems suchen:

dies ist die Ausgabe:

'images': [{'checksum': '2efhz768djdzs76dz', 
      'path': 'full/2efhz768djdzs76dz.jpg', 
      'url': 'http://www.websites.com/1.jpg'}, 
      {'checksum': 'zadz764dhqj34dsjs', 
      'path': 'full/zadz764dhqj34dsjs.jpg', 
      'url': 'http://www.websites.com/2.jpg'}], 

wie bekomme ich die erste oder die zweite Prüfsumme, um in eine SQL-Spalte zu gehen. ich verwende zur Zeit:

item.get ('scrapy-item', ''), für die das stacy Element den Namen des Scraped Items darstellt, vorzugsweise in einem Codebeispiel.

+1

Was wie Sie Ihre SQLite-Tabellen aussehen? –

Antwort

2

Ziel basierend auf den Rängen

x['image_urls'][0] 

Merging Liste der Wörterbuchwerte

>>> images 
[{'path': 'full/2efhz768djdzs76dz.jpg', 'url': 'http://www.websites.com/1.jpg', 'checksum': '2efhz768djdzs76dz'}, {'path': 'full/zadz764dhqj34dsjs.jpg', 'url': 'http://www.websites.com/2.jpg', 'checksum': 'zadz764dhqj34dsjs'}] 
>>> list(map(lambda x : x['url'] + '/' + x['path'], images)) 
['http://www.websites.com/1.jpg/full/2efhz768djdzs76dz.jpg', 'http://www.websites.com/2.jpg/full/zadz764dhqj34dsjs.jpg'] 
>>> list(map(lambda x : x['checksum'], images)) 
['2efhz768djdzs76dz', 'zadz764dhqj34dsjs'] 

Der obige Code sollte Ihnen einen Überblick geben, wie die Konvertierung zwischen Arrays und Wörterbücher zu handhaben. Sie könnten genauso gut über das gesamte Array iterieren und Ihre Werte erhalten, obwohl ich Lambda-Funktionen bevorzuge.

Hoffe, dass dies hilft, ich bin nicht wirklich mit Scrapy vertraut. Wenn Sie sich bei etwas unsicher sind, hinterlassen Sie einfach einen Kommentar.

+1

Danke Philipp, aber ich habe immer noch Probleme spezifische Werte aus der zweiten Liste Targeting: habe ich versucht item.get (lambda x: x [ ‚Prüfsumme‘] [0], Bilder)) aber ohne Glück ich bin globalen Namen Bilder immer nicht definiert, obwohl mein scrapy Ausgang den Ausgang der zweiten Liste – user1443063

+0

@ user1443063 'images' zeigt deutlich, ist nur ein Name für das Array von Wörterbuch. Wenn Sie scrapy oder andere Rahmen erste Dataset zu einem gewissen Datenstruktur verwenden analysieren. In diesem Fall ist ein Array sinnvoll. Die Lambda-Funktion usw. wird dann verwendet, später mit dieser Datenstruktur zu arbeiten. Von Ihrem „Ausgang“ es ist sehr schwierig für mich, wie Sie zu sagen, Ihre Daten-Set gespeichert. Also nahm ich eine Liste von Wörterbüchern an. –

2

Ich bin nicht ganz sicher, was Sie fragen, aber sieht aus wie es ist nicht scrapy bezogen, das Entfernen der scrapy Tag kann mehr Menschen ermutigen, Ihre Frage zu öffnen und Ratschläge zu geben.

Zurück zu Ihrer Frage, obwohl diese Lösung nicht optimal ist es Ihnen geben kann, was Sie auf mein Verständnis für Ihre Frage basiert wollen:

websites_urls=[] 
checksums=[] 
paths=[] 
whole_item=[] 
for image_url in item.get('image_urls'): 
    for image in item.get('images'): 
     if image_url==image['url']: 
      websites_urls.append(image['url']) 
      checksums.append(image['checksum']) 
      paths.append(image['path']) 
      whole_item.append(image) 
      break